一:前言
Android开发经常会用到WebView,用于加载网页。系统自带的WebView性能和流畅度都一般,AgentWeb是一款第三方的WebView,性能比系统自带的要好,功能也更多。
AgentWeb是一个高度封装的Android WebView,简单易用,带进度条,支持文件上传,下载,简化Javascript通信,链式调用,加强Web安全的库。让你轻松集成一个轻量级浏览器在应用上。
功能
支持进度条以及自定义进度条
支持文件下载
支持文件下载断点续传
支持下载通知形式提示进度
简化 Javascript 通信
支持 Android 4.4 Kitkat 以及其他版本文件上传
支持注入 Cookies
加强 Web 安全
支持全屏播放视频
兼容低版本 Js 安全通信
更省电
支持调起微信支付
支持调起支付宝
默认支持定位
支持传入 WebLayout
支持自定义 WebView
支持 JsBridge
二:使用
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需要配置
}
}
//添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
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);
原文:https://segmentfault.com/a/1190000039663918