WebView 的一切都在这儿

本文作者

作者: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位已经提交了相关信息,我已经发给四哥了,还有位胡宸浩一直没有填写,看到请尽快提交,或者后台给我发消息即可~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171226B02SFO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券