Android 第三方库AgentWeb的使用
一:前言
Android开发经常会用到WebView,用于加载网页。系统自带的WebView性能和流畅度都一般,AgentWeb是一款第三方的WebView,性能比系统自带的要好,功能也更多。
AgentWeb是一个高度封装的Android WebView,简单易用,带进度条,支持文件上传,下载,简化Javascript通信,链式调用,加强Web安全的库。让你轻松集成一个轻量级浏览器在应用上。
1.功能
- 支持进度条以及自定义进度条
- 支持文件下载
- 支持文件下载断点续传
- 支持下载通知形式提示进度
- 简化 Javascript 通信
- 支持 Android 4.4 Kitkat 以及其他版本文件上传
- 支持注入 Cookies
- 加强 Web 安全
- 支持全屏播放视频
- 兼容低版本 Js 安全通信
- 更省电 。
- 支持调起微信支付
- 支持调起支付宝(请参照sample)
- 默认支持定位
- 支持传入 WebLayout(下拉回弹效果)
- 支持自定义 WebView
- 支持 JsBridge
AgentWeb是一个轻量级而且功能强大的Web库,大小只有200k
二:使用
1.依赖:
implementation 'com.just.agentweb:agentweb:4.1.3' // (必选)使用这个基础的webView实现
implementation 'com.just.agentweb:filechooser:4.1.3'// (可选)
implementation 'com.download.library:Downloader:4.1.3'// (可选)
2.基本用法
public class FourActivity extends AppCompatActivity {
private LinearLayout ll_root;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
ll_root = findViewById(R.id.ll_root);
AgentWeb agentWeb = AgentWeb.with(this)//传入Activity
.setAgentWebParent(ll_root, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams .useDefaultIndicator()//使用默认进度条
.createAgentWeb()
.ready()//重试
.go("https://www.baidu.com");//https,Android9.0要是使用http需要配置
}
}
//添加权限
Javascript调用Java,AndroidInterface类中有创建一些js方法
//Javascript调Java
agentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(agentWeb,this));
AndroidInterface类中
public class AndroidInterface {
private AgentWeb agent;
private Activity context;
public AndroidInterface(AgentWeb agent, Activity context) {
this.agent = agent;
this.context = context;
}
@JavascriptInterface
public void callAndroid(String url) {
//要用 @JavascriptInterface标注
}
}
调用Javascript方法
//调用Javascript中的方法callAndroid
mAgentWeb.getJsAccessEntrace().quickCallJs("callAndroid");
事件处理
//手机的事件处理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (agentWeb.handleKeyEvent(keyCode,event)){
return true;
}
return super.onKeyDown(keyCode, event);
}
点击返回键
@Override
public void onBackPressed() {
if (agentWeb!=null&&agentWeb.getIEventHandler().back()){
Log.i("callBack", "go back");
}else {
Log.i("callBack", "finish");
finish();
}
}
跟随Activity 或Fragment生命周期,释放CPU更省电
@Override
protected void onPause() {
mAgentWeb.getWebLifeCycle().onPause();
super.onPause();
}
@Override
protected void onResume() {
mAgentWeb.getWebLifeCycle().onResume();
super.onResume();
}
创建WebviewClient,用来帮助WebView处理各种通知,请求事件
有如下等方法
onLoadResource()
onPageStart()
onPageFinish()
onReceiveError()
onReceivedHttpAuthRequest()
WebViewClient webViewClient=new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String title=view.getTitle();//拿到webView的title
if (!TextUtils.isEmpty(title)){
setToolBarTitle(title);
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
}
};
创建WebChromeClient,辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等,
有如下等方法
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert(WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt()
onJsConfirm()
onProgressChanged()
onReceivedIcon()
onReceivedTitle()
private WebChromeClient webChromeClient=new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
};
//使用是链式调用中加入
agentWeb = AgentWeb.with(this)//传入Activity
.setAgentWebParent(ll_root, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams .useDefaultIndicator()//使用默认进度条
.setWebViewClient(webViewClient)//加入webViewClient
.setWebChromeClient(webChromeClient)//加入webChromeClient
.createAgentWeb()
.ready()//重试
.go("https://www.baidu.com");
修改AgentWeb默认的背景色
FrameLayout frameLayout =agentWeb.getWebCreator().getWebParentLayout();
frameLayout.setBackgroundColor(Color.BLUE);
三:注意事项:
- 支付宝使用需要引入支付宝SDK ,并在项目中依赖 , 微信支付不需要做任何操作。
- AgentWeb 内部使用了
AlertDialog
需要依赖AppCompat
主题 。 setAgentWebParent
不支持ConstraintLayout
。mAgentWeb.getWebLifeCycle().onPause();
会暂停应用内所有WebView
。minSdkVersion
低于等于16以下自定义WebView
请注意与JS
之间通信安全。- AgentWeb v3.0.0以上版本更新了包名,混淆的朋友们,请更新你的混淆配置。
- 多进程无法取消下载,解决方案
具体的github地址:[https://github.com/Justson/Ag...
END:知行合一