前言
想要舒服的使用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
一个正在加载的链接在安全浏览模式下被标记