WebView的状态管理有五个方法:
1、onPause() 使页面当前的WebView停止
2、onResume()使页面当前的WebView恢复
3、pauseTimers()使当前页面全部的WebView停止
4、resumeTimers()是当前页面全部的WebView恢复
5、destroy()销毁WebView,这个方法很重要,因为尝试在销毁Activity的时候发现,WebView并没有销毁,这样会导致内存泄漏的问题
@Override
protected void onPause() {
super.onPause();
webView.onPause();
/*webView.pauseTimers();*/
}
@Override
protected void onResume() {
super.onResume();
webView.onResume();
/*webView.resumeTimers();*/
}
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}
然后说下WebView的常用类:
主要是三个常用类:
1、WebSettings:对WebView进行配置和管理,比如,通过
WebSettings控制网页的缩放,以及缓存等等;
2、WebViewVClient:处理webview加载时的各种回调通知,比如,网页在开始加载的回调,加载更多资源的回调,网页跳转时的回调等等;
3、WebChromeClient:辅助webView去处理javaScript对话框、进度等,比如网页弹出的对话框,网页的进度条等等;
现在先介绍下WebSettings的使用方法:
1、控制javaScript代码运行(这是踩坑才发现的,因为有些网页是通过javaScript控制的,而在android里面是默认不允许javaScript代码运行的,所以导致加载的网页会乱或者JS交互部分没有办法显示)
下面是没有设置WebSettings的网页:
image.png
代码如下:
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView=findViewById(R.id.webview);
webView.loadUrl("http://www.baidu.com/");
webView.setWebViewClient(new WebViewClient());
}
}
而添加了之后:
WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);
image.png
2、控制网页的缩放
//设置支持缩放功能
webSettings.setSupportZoom(true);
//设置支持内置的缩放控件
webSettings.setBuiltInZoomControls(true);
//设置显示原生的缩放控件
webSettings.setDisplayZoomControls(true);
3、控制webview的缓存方式
//永远不使用网络,只去本地缓存,没有缓存则不会加载
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
//只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//系统默认的缓存方法,根据cache-control决定是否从网络获取
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
//永远不适用缓存,只从网络获取最新的内容
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//清除缓存的方法
webView.clearCache(true);
注意:第1和2条代码的使用,有个使用弊端,就是只要本地有缓存都会去使用本地缓存,而不管网页的有啥变化,
然后cache-control可能小伙伴会有点疑惑,就大概解释下:
这个是在nodejs中实现的,node的是体现在app.js中代码
这句的意思是控制缓存时间为10秒
app.use(cacheControl({
maxAge 10
}));
那这个的实际影响是什么呢?也就是说,如果网页内容发生了变化,但是我们在客户端上面如果在10秒之内刷新的话,是看不到新的变化,但是过了10秒之后再刷新就可以看到了
然后继续说下WebViewVClient:
在我们使用webview的过程中,如果没有加入
webView.setWebViewClient(new WebViewClient());
这句代码的时候,发现webview依然可以正常加载,但是如果我们在去使用它跳转其他网页的时候,你会发现,打开的是手机默认的浏览器而不是我们的APP。
然后我们开始验证下WebViewVClient的用法:
webView.setWebViewClient(new WebViewClient(){
//此方法是在android5.0以上才可以使用的,但是这个request可以调用更多的方法
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+request.getUrl().toString());
}
return super.shouldInterceptRequest(view, request);
}
//此方法是任何版本都可以使用的
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+url);
return super.shouldInterceptRequest(view, url);
}
//参数1:是webview自身,参数2:是进行请求的URL,参数3:在网页标签上展示的图标
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.e("WebViewActivity","webview->onPageStarted 网页开始进行加载url:"+url);
super.onPageStarted(view, url, favicon);
}
@Override
public void onLoadResource(WebView view, String url) {
Log.e("WebViewActivity","webview->onLoadResource 网页开始加载资源url:"+url);
super.onLoadResource(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
Log.e("WebViewActivity","webview->onPageFinished 网页加载完成url:"+url);
}
});
通过打印可以看到他们的执行顺序:
image.png可以看到,每个控件或者网页内容,都会执行shouldInterceptRequest()->onPageStarted()->onLoadResource()->onPageFinished(),但是注意看下最后的onPageFinished()只执行了一次
地址拦截:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//当跳转的地址为百度的时候,拦截下来,并跳转到搜狗的网页
if ("http://www.baidu.com/".equals(url)){
view.loadUrl("http://www.sogou.com/");
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
但报错的时候,为了提升客户使用感受,我们可以在代码中进行处理:
webView.setWebViewClient(new WebViewClient(){
//参数2:错误的代码,参数3:错误的描述信息,参数4:访问错误的url
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//在这里可以对于setWebViewClient发生错误的时候,进行处理动作,例如跳转到我们制定的页面之类的
super.onReceivedError(view, errorCode, description, failingUrl);
}
最后,说下WebChromeClient
webView.setWebChromeClient(new WebChromeClient(){
//获取网页加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
//获取网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
//下面三种方法是对网页弹出的三种类型的对话框进行处理, 注意下,这三个方法都是返回boolean类型的值,
// 当返回是false的时候,就是由WebView进行处理,反之就是我们自己去处理,同时需要用result来进行调用
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
});
}
好啦!今天的介绍到了这里,希望大家都可以学得明明白白吧,我已经写得很详细了,如果大家还有疑问,可以在下方留言,我每天都会看的!!
网友评论