简介
WebView,类似PC浏览器,接收到http/https的url时向host发送一个请求。
Android API 4.4以前,谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,之后需在调用Java方法加入@JavascriptInterface注解,才可执行。
Javascript bridge。
示例
webview 不调用系统自带浏览器
WebView webView = new WebView(this);
webView.loadUrl("http://www.baidu.com");
WebSettings webSet = webView.getSettings();
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url)
{ // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
view.loadUrl(url);
return true;
}
});
WebView的坑
webview有一些坑,比如4.4以下图片无法删除,还有些光标问题。
NET::ERR_UNKNOWN_URL_SCHEME
打开自定义协议的URL时,报错。WebView只支持http/https请求,无法处理自定义协议的URL。
解决方法:是自定义协议,就换成原生调用(intent跳转)。
WebViewClient mWebViewClient = new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (url == null) return false;
try {
if (url.startsWith("weixin://") || url.startsWith("alipays://") ||
url.startsWith("mailto://") || url.startsWith("tel://")//自定义scheme
) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
} catch (Exception e) {
//防止没安装处理某个scheme开头的url的App,导致Crash。
return false;
}
//处理http和https开头的url。
webView.loadUrl(url);
return true;
}
};
加载进度框,监听加载进度
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO 自动生成的方法存根
if(newProgress==100){
pg1.setVisibility(View.GONE);//加载完网页进度条消失
}else{
pg1.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
pg1.setProgress(newProgress);//设置进度值
}
}
});