本文作者
作者:reezy
链接:
https://www.jianshu.com/p/a6f7b391a0b8
本文由作者授权发布。
文章较长,且大部分说明包含在注释中,建议收藏后慢慢看~
1
目录
1. 相关API
1.1. 相关类介绍
1.2. WebView
1.3. WebSettings
1.4. WebViewClient
1.5. WebChromeClient
2.回调顺序
3.视口(viewport)
4.管理 Cookies
5.缓存(Cache)
6.预加载(Preload)
6.与Javascript交互
8.地理位置(Geolocation)
9.弹框(alert/confirm/prompt/onbeforeunload)
10.全屏(Fullscreen)
11. 内存泄漏
12.参考
2
相关API
相关类介绍
WebResourceRequest添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向
WebResourceResponse封装了一个Web资源的响应信息,包含:响应数据流,编码,MIME类型,API21后添加了响应头,状态码与状态描述
WebResourceError添加于API23,封装了一个Web资源的错误信息,包含错误码和描述
CookieManager管理用于WebView的cookies。。
WebViewDatabase存储与管理以下几类浏览数据:
表单自动填充的的用户名与密码
HTTP认证的用户名与密码
曾经输入过的文本(比如自动完成)
WebStorage用于管理WebView提供的JS存储API,比如Application Cache API,Web SQL Database API,HTML5 Web Storage API
GeolocationPermissions用于管理WebView的JS Geolocation API
HttpAuthHandler表示一个HTTP认证请求,提供了方法操作(proceed/cancel)请求
SslErrorHandler表示一个处理SSL错误的请求,提供了方法操作(proceed/cancel)请求
ClientCertRequest表示一个证书请求,提供了方法操作(proceed/cancel/ignore)请求
JsResult用于处理底层JS发起的请求,为客户端提供一些方法指明应进行的操作,比如确认或取消。
WebView
基本
加载网页
Javascript
导航(前进后退)
网页查找功能
截屏/翻页/缩放
其它
WebSettings
通常大部分保持默认值就好了
WebViewClient
WebChromeClient
3
回调顺序
页面加载回调顺序:
资源加载回调:
发生重定向时回调:
直接loadUrl的回调:
后退/前进/刷新 时回调:
关于window.location
假设从A页面跳转到B页面
如果页面B中直接输出 window.location="http://example.com",那页面B不会被加入回退栈,回退将直接回到A页
如果页面B加载完成后,比如用setTimeout延迟了,那页面B会被加入回退栈,当回退到页面A时会再执行跳转,这会导致回退功能看起来不正常,需要快速回退两次才能回到A页面
4
视口(viewport)
https://developer.android.com/guide/webapps/targeting.html
https://developer.mozilla.org/en-US/docs/Mozilla/Mobile/Viewport_meta_tag
https://developer.mozilla.org/zh-CN/docs/Web/CSS/@viewport
视口是一个为网页提供绘图区域的矩形。
你可以指定数个视口属性,比如尺寸和初始缩放系数(initial scale)。其中最重要的是视口宽度,它定义了网页水平方向的可用像素总数(可用的CSS像素数)。
多数 Android 上的网页浏览器(包括 Chrome)设置默认视口为一个大尺寸(被称为"wide viewport mode",宽约 980px)。
也有许多浏览器默认会尽可能缩小以显示完整的视口宽度(被称为"overview mode")。
viewport 语法
指定视口宽度精确匹配设备屏幕宽度同时禁用了缩放
通过WebView设置初始缩放(initial-scale)
5
管理 Cookies
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
Cookie 是服务器发送到用户浏览器并保存在浏览器上的一块数据,它会在浏览器下一次发起请求时被携带并发送到服务器上。
可通过Cookie保存浏览信息来获得更轻松的在线体验,比如保持登录状态、记住偏好设置,并提供本地的相关内容。
会话Cookie 与 持久Cookie
会话cookie不需要指定Expires和Max-Age,浏览器关闭之后它会被自动删除。
持久cookie指定了Expires或Max-Age,会被存储到磁盘上,不会因浏览器而失效。
第一方Cookie 与 第三方Cookie
每个Cookie都有与之关联的域,与页面域一样的就是第一方Cookie,不一样的就是第三方Cookie。
读取/写入/移除 Cookie
webkit cookie 工具类
同步系统Cookie 与 Webkit Cookie
6
缓存(Cache)
设置缓存模式
WebSettings.LOAD_DEFAULT 根据cache-control决定是否从网络上取数据
WebSettings.LOAD_CACHE_ELSE_NETWORK 无网,离线加载,优先加载缓存(即使已经过期)
WebSettings.LOAD_NO_CACHE 仅从网络加载
WebSettings.LOAD_CACHE_ONLY 仅从缓存加载
清除缓存
7
预加载(Preload)
一个简单的预加载示例(shouldInterceptRequest)
点击 assets/demo.xml 里的链接"hello"时会加载本地的 assets/hello.html
assets/demo.xml
assets/hello.html
重载 shouldInterceptRequest
8
与Javascript交互
启用Javascript
注入对象到Javascript
在API17后支持白名单,只有添加了@JavascriptInterface注解的方法才会注入JS
移除已注入Javascript的对象
执行JS表达式
在API19后可异步执行JS表达式,并通过回调返回值
9
地理位置(Geolocation)
https://developer.mozilla.org/zh-CN/docs/Web/API/Geolocation/Using_geolocation
需要以下权限
默认可用
当H5调用地理位置API时,会先通过WebChromeClient.onGeolocationPermissionsShowPrompt申请授权
注:从API24开始,仅支持安全源(https)的请求,非安全源的请求将自动拒绝且不调用 onGeolocationPermissionsShowPrompt 与 onGeolocationPermissionsHidePrompt
10
弹框(alert/confirm/prompt/onbeforeunload)
在javascript中使用 alert/confirm/prompt 会弹出对话框,可通过重载 WebChromeClient 的下列方法控制弹框的交互,比如替换系统默认的对话框或屏蔽这些对话框
11
全屏(Fullscreen)
Fullscreen API
https://developer.mozilla.org/zh-CN/docs/DOM/Using_fullscreen_mode
当H5请求全屏时,会回调 WebChromeClient.onShowCustomView 方法
当H5退出全屏时,会回调 WebChromeClient.onHideCustomView 方法
1.manifest
自己处理屏幕尺寸方向的变化(切换屏幕方向时不重建activity)
WebView播放视频需要开启硬件加速
2.页面布局
3.处理全屏回调
4.设置全屏,切换屏幕方向
12
内存泄漏
直接 new WebView 并传入 application context 代替在 XML 里面声明以防止 activity 引用被滥用,能解决90+%的 WebView 内存泄漏。
注:此方法会导致select无法弹出,因为select默认会弹出一个原生的框,需要activity承载。
销毁 WebView
参考
https://developer.android.com/reference/android/webkit/package-summary.html
Fullscreen API 全屏显示网页
http://calefy.org/2012/06/03/fullscreen-web-page-width-fullscreen-api.html
WebView实现全屏播放的一种方法
https://segmentfault.com/a/1190000007561455
第一方Cookie和第三方Cookie区别
https://www.biaodianfu.com/first-party-cookie-and-third-party-cookie.html
Android WebView的Js对象注入漏洞解决方案
http://blog.csdn.net/leehong2005/article/details/11808557
Android安全开发之WebView中的地雷
http://yaq.qq.com/blog/10
Android WebView:性能优化不得不说的事
https://juejin.im/entry/57d6434067f3560057e50b20
上次四哥的书,通过小程序中奖的,其中7位已经提交了相关信息,我已经发给四哥了,还有位胡宸浩一直没有填写,看到请尽快提交,或者后台给我发消息即可~
领取专属 10元无门槛券
私享最新 技术干货