每日一言:这一秒不放弃,下一秒就会有希望。
欢迎一起讨论和学习,QQ:732258496 QQ群:478720016
相关文章:浏览器内核-一张图看懂

一.注释说明
1. 简介:它是一个基于Webkit引擎、展示WebView的控件。(4.4之后使用了Chrome的blink内核)
2. 作用:(1) . 显示和渲染Web页面;
(2). 直接使用html文件(网络上或本地assets中)作布局;
(3). 可和JavaScript交互调用;
(功能强大,除了具有一般View的属性和设置外,还可以对URL请求,页面加载,渲染,页面交互进行强大的处理)
3. 使用介绍 :单独使用 或者 联合其它子类一起使用
(1). webview自身的常见方法
(2).常用子类:WebSettings、WebViewClient、WebChromeClient
(3).Android 和JS的交互
二.WebView的常用方法
1. WebView的状态如下
//激活webview为活跃状态,能正常执行网页的相应
webView.onResume();
//当前页面失去焦点被切换到后台不可见状态,需要执行onPause()
webView.onPause();
//当应用程序(存在webview)被切换到后台时,、不仅针对当前的webview而是全局的全应用程序的webview
//会暂停所有webview的layout,parsing,javascripttimer,降低cpu功耗
webView.pauseTimers();
//恢复pauseTimers状态
webView.resumeTimers();
//销毁webview
//在关闭Activity时,如果webview的音乐或视频,孩子播放,就必须销毁webview
//但是注意:webview调用destory时,webview仍绑定在activity上
//这是由于自定义webview构建时候传入了改activity的context对象
//因此先要从父容器中移除webview,然后销毁webview
((ViewGroup) webView.getParent()).removeView(webView);
webView.destroy();
2. 关于前进/后退网页
//是否可以后退
webView.canGoBack();
//后退网页
webView.goBack();
//是否可以前进
webView.canGoForward();
//前进网页
webView.goForward();
//以当前的index为起点前进或者后退道理是记录中指定的steps
//如果steps为负数则为后退,正数则为前进
webView.goBackOrForward(intsteps);
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
3. 清除缓冲数据
//清除网页访问留下的缓冲
//由于内核缓冲是全局的因此这个方法不仅仅针对webview而是针对整个应用缓冲
webView.clearCache(true);
//清除当前webview访问的历史记录
webView.clearHistory();
//仅仅清除自动完成填充的表单数据,不会清除webview存储在本地的数据
webView.clearFormData();
三.WebView的常用类
1. WebSettings 类
//声明WebSettings子类
WebSettings webSettings = webView.getSettings();
//如果访问的页面要与JavaScript交互,则Webview必须支持javascript
webSettings.setJavaScriptEnabled(true);
//支持插件
//设置自适应屏幕
//缩放操作
//其它:是否启用缓冲,图片,格式,文件等
2. WebViewClient 类
//1.直接在Webview中显示网页,不调用系统浏览器
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
}
//2.载入页面开始开始调用用的
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
tvBeginLoading.setText("开始加载了");
}
//3.载入页面结束调用的
@Override
public void onPageFinished(WebView view, String url) {
tvEndLoading.setText("结束加载了");
}
//4.出现错误时 404
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
super.onReceivedError(view, request, error);
}
//5.处理https请求(webview默认是不处理https请求的,页面显示空白,需要进行如下设置)
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
}
});
3. WebChromeClient 类
webView.setWebChromeClient(new WebChromeClient() {
//获取web页中的标题
@Override
public void onReceivedTitle(WebView view, String title) {
tvTitle.setText(title);
}
//获取网页的加载进度并显示
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress + "%";
tvLoading.setText(progress);
} else if (newProgress == 100) {
String progress = newProgress + "%";
tvLoading.setText(progress);
}
}
});
四.WebView与JS的交互
详情见下一章节(待完)
五.注意事项:如何避免WebVie内存泄漏
1.不在xml中定义WebView,而是在需要的时候在Activity中创建,并且Context使用getApplicationContext()
2.在Activity销毁(WebBiew)的时候,先让WebView加载null内容,然后移除WebView,在销毁WebView,最后置空
@Override
protected void onDestroy() {
if(webView!=null){
webView.loadDataWithBaseURL(null,"","text/html","utf-8",null);
webView.clearHistory();
//销毁webview
//在关闭Activity时,如果webview的音乐或视频,孩子播放,就必须销毁webview
//但是注意:webview调用destory时,webview仍绑定在activity上
//这是由于自定义webview构建时候传入了改activity的context对象
//因此先要从父容器中移除webview,然后销毁webview
((ViewGroup) webView.getParent()).removeView(webView);
webView.destroy();
webView=null;
}
super.onDestroy();
}
五.实例
注意点:网络权限;
在webview中显示必须设置 setJavaScriptEnabled setWebViewClient;
加载“https://www.baidu.com/”。
410

被折叠的 条评论
为什么被折叠?



