一、什么是WebView
WebView是Android中UI组件的一种
WebView基于webkit内核(Chromium)
调试:
代码中允许WebView进行网页调试
WebView.setWebContentsDebuggingEnabled(true)
然后在chrome浏览器中输入chrome://inspect
二、WebView加载网页的四种方式
1、loadUrl(String url)
//加载网络数据
webView.loadUrl("http://www.baidu.com");
//加载本地文件
webView.loadUrl("file://mnt/sdcard/index/test.html" );
//加载asset文件
webView.loadUrl("file:///android_asset/index.html");
2、loadUrl(String url, Map<String, String> additionalHttpHeaders)
加请求头。
val headers = mutableMapOf("aaa" to "bbb")
mWebView.loadUrl("http://www.baidu.com/", headers)\
3、loadData(String data, String mimeType, String encoding)
这个方法允许我们将一个HTML代码直接显示到WebView中。
String htmlString = "<h1>Header</h1><p>This is HTML text<br /><i>Formatted in italics</i></p>";
lowerView.loadData(htmlString, "text/html", "utf-8");
4、loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
mWebView.loadDataWithBaseURL(
"http://www.imooc.com/",
"<img src=\"static/img/index/logo.png\"/><a href=\"http://www.baidu.com\">to baidu</a>",
"text/html",
"utf-8",
"http://www.sougou.com"
)
三、控制网页的前进和后退
boolean canGoBack()
boolean canGoForward()
boolean canGoBackOrForward(int steps)
boolean goBack()
boolean goForward()
//向前(后)导航,steps为正,表示向前,为负,则表示向后
boolean goBackOrForward(int steps)
//清除历史记录
void clearHistory()
四、WebView的状态管理
onPause()
onResume()
pauseTimers()
//跟onPause相同,但是是针对所有webView的
resumeTimers()
destroy()
五、WebView的常用类
5.1、WebSettings
对WebView进行配置和管理
1、WebView支持JavaScript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
2、WebView支持页面缩放
WebSettings settings = webView.getSettings();
//是否支持缩放,默认为true
settings .setSupportZoom(true);
//允许缩放
settings .setBuiltInZoomControls(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//添加缩放按钮
webView.getSettings().setDisplayZoomControls(false);
}
3、WebView的网页缓存策略
LOAD_DEFAULT
根据cache-control决定是否从网络获取
LOAD_CACHE_ELSE_NETWORK
只要有缓存,无论过期与否,都加载缓存,否则加载网络
LOAD_NO_CACHE
不使用缓存,只从网络获取
LOAD_CACHE_ONLY
仅使用缓存,如果没有缓存,则不进行加载
5.2、WebViewClient
处理WebView加载时的各种回调通知
常用回调:
1、shouldInterceptRequest
用于拦截请求,可以在此处查看和修改Url,headers参数等。注意,它与onPageStarted调用顺序不是固定的。并且每次网页请求都会调用此方法。
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
2、onPageStarted
onPageStarted一定是在onLoadResource之前回调。
页面开始加载时回调,其中favicon,是浏览器标签栏显示的小图标。
public void onPageStarted(WebView view, String url, Bitmap favicon)
3、onLoadResource
在网页加载资源时回调。
public void onLoadResource(WebView view, String url)
4、onPageFinished
页面加载结束时回调
override fun onPageFinished(view: WebView?, url: String?)

5、shouldOverrideUrlLoading
WebView页面内部加载新的url时进行回调。当返回true时,表示我们自己对其进行处理,返回false时,表示WebView对其进行处理。默认为false。
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
6、onReceivedError
页面访问发生错误的时候回调
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
5.3、WebChromeClient
通过回调获取网页加载进度,监听对话框的弹出、获取网页标题图标等等。
1、onProgressChanged
获取网页加载进度
public void onProgressChanged(WebView view, int newProgress)
2、onReceivedTitle
获取网页的标题
public void onReceivedTitle(WebView view, String title)
3、onJsAlert
在网页将要打开一个alert警告对话框的时候回调
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
4、onJsConfirm
在网页将要打开一个confirm对话框的时候回调
public boolean onJsConfirm(WebView view, String url, String message, JsResult result)
5、onJsPrompt
在网页将要打开一个prompt对话框的时候回调
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
注意:3~5方法,当返回true时,表示我们自己处理弹出框事件,此时界面会等待我们返回,我们需要调用参数中的result对应的相关方法,给WebView返回结果。
五、WebView与JS交互
5.1、Android去调用js代码
1、loadUrl
loadUrl("javascript:方法名(参数 ...)")
*注意:
此方法的缺点是没办法获取网页js代码的返回值,如果返回值是String类型,那这个String,会替换网页body的内容。
我们可以通过将方法添加到alert方法中,然后从onJsAlert的message参数中获取到返回值。
loadUrl("javascript:alert(sum(2, 3))")
2、evaluateJavascript
mWebView.evaluateJavascript("javascript:sum(2, 3)", new ValueCallback<String>() {
override fun onReceiveValue(value: String?) {
}
})
5.2、js调用Android代码
1、拦截JavaScript请求的回调方法
*注意:
JS中无法方便的获取android的返回值,使用烦琐。
监听WebViewClient的shouldOverrideUrlLoading方法。
工具接收到的url去判断,在android中需要执行的内容。
2、对象映射
*注意:
在android4.2以下存在安全漏洞
1、调用WebView的addJavascriptInterface(object, name)进行对象映射。
webView.addJavascriptInterface(this, "justTest");
2、在映射类中声明需要被Js调用的方法,并添加@JavascriptInterface注解。
@JavascriptInterface
public void hello(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
3、在JS代码中,通过name.方法名() 的方式来调用android的映射类中的被@JavascriptInterface注解的方法。
<button onclick="justTest.hello('js调用安卓方法!')">调用安卓方法</button>
网友评论