前言

想要舒服的使用webview,就不得不了解webview三剑客,websettings,webchromeclient,webviewclient。 对这三者做一些合理的配置,我们的webview才能更好的适配网页渲染。本篇文章会对这三个类的api进行详细的解说。 可能会略显枯燥,但是每条Api配置都有其作用,这也是学习webview的必经之路。

1.WebSettings

WebSettings里面看到了大量的@Deprecated的注解,随着Android SDK升级,webview也做了大量调整,如果这些 Deprecated注解以后都成现实,以后的webview配置也越来越不灵活。可能Google是出于安全性这个大主题去考虑。 限制部分API也许也是一种选择

1.setNavDump

设置是否dump页面导航缓存到文件系统

2.setSupportZoom

设置是否支持屏上控制或者手势控制的缩放,setBuiltInZoomControls会提供通用的缩放控制方式。并且改设置不会影响 zoomIn和zoomOut的表现。

3.setMediaPlaybackRequiresUserGesture

设置是否由用户手势来触发媒体播放行为

4.setBuiltInZoomControls

设置是否使用内置的缩放工具。内置的缩放工具包括显示在webview内容之上的屏上缩放控制和通过两点手势来实现缩放控制。 setDisplayZoomControls来设置是否显示屏上缩放按钮。并且内置缩放设备是目前唯一被支持的缩放设施。

5.setDisplayZoomControls

设置是否显示屏上缩放按钮

6.setAllowFileAccess

设置是否开启文件系统访问权限,而Assets和resources还是可以直接通过file:///android_asset 和 file:///android_res来访问

7.setAllowContentAccess

设置是否允许webview去加载一个系统上安装的内容提供者提供的资源URL

8.setLoadWithOverviewMode

设置是否用概览方式来加载url,概览方式就是让页面在宽度上全部显示的方式。

9.setEnableSmoothTransition

设置是否在webview中拖拽,缩放或者当webview失去焦点时进行平滑转化渲染。如果是true,webview就会 使用某些手段来维持渲染性能,就好像在转化中webview的内容不曾更新一样。如果是false,那么渲染过程就看上去 比较实时,比较保真。

10.setUseWebViewBackgroundForOverscrollBackground

设置是否在过度滑动时将背景显示为webview的背景,如果不是true就使用内部模式

11.setSaveFormData

设置是否会存储表单数据,在android O 之后有全新的功能来实现存储表单的功能。

12.setSavePassword

设置是否可以存储密码

13.setTextZoom

设置文本缩放值

14.setAcceptThirdPartyCookies

设置是否支持接收第三方cookies

15.setDefaultZoom

设置一个默认的缩放参数,并且实在UI线程使用。这个方法是不推荐继续使用的,以后会被废弃。在H5页面也可以通过 使用meta标签中的width和initial-scale来达到同样的效果的。

16.setLightTouchEnabled

开启使用轻触就能达到选择和有效鼠标事件的功能

17.setUseDoubleTree

暂无解释

18.setUserAgent

给0表示显示Android 的User-Agent的字符串字样 给1表示显示Desktop 的User-Agent的字符串字样

19.setUseWideViewPort

设置是否支持viewport的meta标签,当这个值是false,布局宽度取决于webview的css像素; 如果是值为true并且也使用了viewport的属性,那么布局宽度取决于meta提供的width值;如果 没有使用mate标签或者没有提供一个宽度,那么就会显示一个较宽的视图。

20.setSupportMultipleWindows

设置是否支持多窗口,如果支持,WebChromeClient中的onCreateWindow需要被实现。

21.setLayoutAlgorithm

设置布局排列算法。具体值如下 NORMAL – 默认选择 SINGLE_COLUMN – 将布局放在一个view的宽度的一列中 NARROW_COLUMNS – 所有列的宽度都不能超过屏幕宽度 TEXT_AUTOSIZING – 在概览模式下,一个较宽视图的字体大小能自适应来保持文字的可读性

22.setStandardFontFamily

设置字体样式,默认值是“sans-serif”

23.setFixedFontFamily

设置固定的字体样式,默认值是“monospace”

24.setMinimumFontSize

设置字体大小最小值

25.setMinimumLogicalFontSize

设置一个合理的最小字体大小

26.setDefaultFontSize

设置默认的字体大小

27.setDefaultFixedFontSize

设置默认固定的字体大小

28.setLoadsImagesAutomatically

控制是否显示图片资源,也包括那些内置的使用了URI的scheme的数据,可以通过setBlockNetworkImage 来控制只显示网络图片资源。并且如果这个值从false变成true,图片资源也会立马重新加载

29.setBlockNetworkImage

设置是否显示网络图片资源,setLoadsImagesAutomatically设置true时,这个方法不起作用。

30.setJavaScriptEnabled

设置是否允许js执行

31.setAllowUniversalAccessFromFileURLs

设置js是否拥有加载文件不同来源的权限,为了保证一些安全性,这个应该被关掉。这个设置只会影响文件权限 对于像image标签挂载的资源是不受影响的。

32.setAllowFileAccessFromFileURLs

设置文件访问权限。作用域比setAllowUniversalAccessFromFileURLs小。

33.setPluginsEnabled

开始插件功能与否

34.setPluginState

设置插件的存在状态 ON – 即使插件不存在,相应的对象也会出现 ON_DEMAND – 插件如果是安装过的,就会先出现一个占位,然后点了这个占位插件才会生效 OFF – 表示所有插件都会失效并且所有的备用方案都会被使用

35.setPluginsPath

给插件自定义一个加载路径

36.setDatabasePath

database storage的存储路径,路径要可写,并且只能调用一次,多次调用会被忽略

37.setGeolocationDatabasePath

Geolocation database storage的存储路径,路径要可写

38.setAppCacheEnabled

设置storage缓存的使用。

39.setAppCachePath

storage缓存的路径

40.setAppCacheMaxSize

storage的最大存储值,所允许的值大概跟database所支持的值大致相近,所以这个只是提供一个参照,不是 硬性规定。设置一个小点的值不会影响database的存储。默认值是Integer.MAX_VALUE,推荐使用默认值

41.setDatabaseEnabled

设置是否使用database storage API

42.setDomStorageEnabled

设置使用Dom storage api ,包括sessionStorage和localstorage等

43.setJavaScriptCanOpenWindowsAutomatically

自动开启window.open()功能

44.setDefaultTextEncodingName

设置默认的编码方式(默认是UTF-8)

45.setUserAgentString

设置user-agent的值,没有设置的话就使用系统的默认值

46.setNeedInitialFocus

告诉webview是否在当requestFocus被调用时去设置一个节点

47.setRenderPriority

设置渲染线程的优先级,这个在每个进程只需要调用一次

48.setCacheMode

设置Cache的模式,cache的方式取决于导航类型,一个正常的页面加载,回去尽量检查cache和让页面重新生效, 如果导航后退时,就不是让页面重新生效而是从cache得到缓存内容。这个方法可以改变缓存模式。具体参数如下

LOAD_DEFAULT – 默认模式 LOAD_CACHE_ELSE_NETWORK – 尽量使用缓存的数据,即使这个数据已经过期,否则就是从网络去加载 LOAD_NO_CACHE – 不使用缓存,从网络加载 LOAD_CACHE_ONLY – 不使用网络加载,只使用缓存

49.setMixedContentMode

用来配置当一个安全的资源去加载一个不安全资源时的情况。参数如下 MIXED_CONTENT_ALWAYS_ALLOW – 总是允许加载 MIXED_CONTENT_NEVER_ALLOW – 不允许加载不安全内容 (推荐) MIXED_CONTENT_COMPATIBILITY_MODE – 兼容模式

50.setVideoOverlayForEmbeddedEncryptedVideoEnabled

是否允许H5播放内置加密视频

51.setOffscreenPreRaster

当webview是关联于window并且还是在屏幕之外的是否需要被栅格化,打开这个设置就能避免在屏幕上活跃一个屏幕 之外的webview时去渲染工件。

52.setSafeBrowsingEnabled

设置安全浏览模式,通过对链接的认证来防止一些恶意软件和网络攻击

53.setDisabledActionModeMenuItems

对菜单功能的设置。具体参数如下 MENU_ITEM_NONE – 不能禁止菜单 MENU_ITEM_SHARE – 禁止“Share”菜单 MENU_ITEM_WEB_SEARCH – 禁止“Web Search”菜单 MENU_ITEM_PROCESS_TEXT – 禁止所有的文本处理菜单

2.WebChromeClient

1.onProgressChanged

通知宿主app,当前webview加载资源的进度

2.onReceivedTitle

通知当前宿主app,document上的标题变化

3.onReceivedIcon

通知当前宿主app,当前页面的icon

4.onReceivedTouchIconUrl

通知宿主app,响应apple-touch-icon的url跳转

5.onShowCustomView

通知宿主app当前页面进入全屏模式,要使用自定义的全屏布局来显示页面,视频等

6.onHideCustomView

通知宿主app当前页面推出全屏模式

7.onCreateWindow

请求宿主app创建一个window,如果宿主app选择接收这个请求,返回true,并且创建一个新的webview来 把持这个window,并把他挂载在视图系统上,并且将新webview携带成参数通过resultMsg来发送给目标

8.onRequestFocus

请求显示并且为当前webview获取焦点。当另外一个webview要打开一个当前webview中的一个链接并且请求它 这个webview已经显示时调用

9.onCloseWindow

通知宿主app关闭window并且从view系统中移除它

10.onJsAlert

js调用alert时触发

11.onJsConfirm

js调用confirm时触发

12.onJsPrompt

js调用prompt时触发

13.onJsBeforeUnload

从当前导航从页面离开时会弹出一个弹框来确认,这个就是没有加载之前的js事件的返回值。如果返回true,WebView 就会认为客户端这边确定这个弹框并且调用了JsResult的方法来返回结果,如果返回false,一个默认值就会直接返回给 js来同意离开当前页面路由。

14.onExceededDatabaseQuota

告诉客户端这边对于一个特定来源的数据库database操作已经超出指标了,需要另外分配指标。并且需要反射 WebStorage.QuotaUpdater#updateQuota方法来重新配额。

15.onReachedMaxAppCacheSize

告诉客户端这边cache的配额已经超额了,需要请求WebStorage.QuotaUpdater#updateQuota方法来重新配额

16.onGeolocationPermissionsShowPrompt

通知宿主app web内容请求Geolocation方面的api,但是没有权限,客户端这边需要获取该权限

17.onPermissionRequest

通知宿主app web中目前在请求一些权限。

18.onPermissionRequestCanceled

通知宿主app,web的一些权限请求行为被拒绝了。

19.onJsTimeout

当js的执行器执行超时了,会通知客户端,如果客户端返回true,表示中断js执行,如果返回false,表示继续执行, 并且会重置计时器,如果下一个即使周期还是超时会继续回调该方法

20.onConsoleMessage

通知宿主app,js有console日志

21.getDefaultVideoPoster

客户端这边返回一个图标,用于在视频缓冲时显示的封面

22.getVideoLoadingProgressView

客户端这边返回一个view,用于在视频缓冲时显示的loadding效果

23.getVisitedHistory

返回所有的浏览历史

24.onShowFileChooser

通知宿主app显示一个文件显示器。这个是用来处理包含file的input标签的。如果要取消这个请求, 通过filePathCallback.onReceiveValue(null)并且返回true。

25.setupAutoFill

通知客户端,渲染过的也页面包含一个自动填充的表格,客户端这边可以为其建立简介

3.WebViewClient

1.shouldOverrideUrlLoading

让webview参与到url跳转过程中来。如果webviewclient没有提供这个方法,那么就会让ActivityManager 来寻找合适的handler来处理这个url。返回true表示需要经过客户端处理,返回false表示不经过。 并且post请求不会经过这里。

2.onPageStarted

通知客户端,一个页面已经开始加载,在每个渲染过程只会调用一次,并且iframes和framesets也是如此。 一个内置页面也会调用一次该方法。

3.onPageFinished

通知宿主app,一个页面加载完成了。只在主线程中调用。调用时,图片不会得到更新,如果需要得到新图片的通知 使用WebView.PictureListener#onNewPicture

4.onLoadResource

通知宿主app,在url中回去加载一些资源。

5.onPageCommitVisible

这个回调主要是得出重新使一个webview可见时精确时机,来确保没有旧的内容被显示。这个时机一般比确保前一个 路由的内容不再被渲染时还要提前一点。下一个渲染对象不是webview的背景颜色就是新的页面的内容。

6.shouldInterceptRequest

通知宿主app有一个资源请求,希望客户端返回一个数据。如果返回为null,webview会继续加载资源,否则返回的 数据就会被应用,注意这个方法是在非UI线程中调用,所以要格外注意获取私密资源和UI系统

7.onTooManyRedirects

通知客户端当前存在大量的重定向操作,让客户端决定是否继续执行。

8.onReceivedError

通知客户端这边有一些错误,并且这些错误是不可恢复的。错误码是定义过的常量,可以对比查找

9.onReceivedHttpError

通知客户端加载服务器资源错误,这个会在加载ifranms,image等任何资源错误是调用。不推荐在该回调方法中 做太多的处理工作,并且返回内容可能没有提供错误码

10.onFormResubmission

在WebView需要重新提交表单时触发(使用POST请求)

11.doUpdateVisitedHistory

通知客户端更新浏览历史

12.onReceivedSslError

通知客户端在加载资源时又一个ssl错误出现,客户端可以选择使用cancel proceed来选择处理

13.onReceivedClientCertRequest

通知WebView处理SSL客户端证书请求,使用cancel proceed来处理,并且系统会记住该次选择,以后就按照这个 选择进行处理,该方法会在UI线程调用

14.onReceivedHttpAuthRequest

通知客户端有http的认证请求

15.shouldOverrideKeyEvent

通知应用处理按键点击事件,返回true,webivew不处理该事件,返回false,webview已经处理过了

16.onUnhandledKeyEvent

如果shouldOverrideKeyEvent返回true,按键点击事件就会触发这个方法,在这个方法中可以执行一些自定义的操作。

17.onScaleChanged

当缩放比改变时触发

18.onReceivedLoginRequest

当有登陆请求时会触发

19.onRenderProcessGone

通知客户端渲染线程退出了

20.onSafeBrowsingHit

一个正在加载的链接在安全浏览模式下被标记