您的位置:首页 > 移动开发

Android WebView 开发详解(三)

2017-04-13 16:39 183 查看

前言

这篇主要讲的是WebSettings,api讲的不多,但是讲了一下新旧版本的WebSettings的架构变化,图片我转不过来,所以就不贴图了。完整的博客大家去看原文,我把使用过的api添加到最下面。

正文

转载请注明出处 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao

概览

Android WebView提供展示网页,也提供我们应用程序对网页加载的一些定制,比如我们为了减少网络数据可以设置当前加载的页面不能显示图片,如果是pc网址在pad上访问我们可以提供用户一种概览模式的浏览方式,可以提供放大网页字体等定制功能。Android 提供管理WebView的一些setting的类WebSettings,在WebView对象被创建时WebSettings对象也会被同时创建,并附有默认的settings值. WebSettings对象可以通过WebView.getSettings()获得。WebSettings的生命周期同WebView生命周期相同,如果WebView被destroy 则WebSettings应该被释放,否则如果使用WebSettings继续再操作的话, 会抛出异常IllegalStateException。

1.WebSettings API详解

调用WebSettings设置的所有函数是异步制定的,因此我们设置某个状态并不能马上生效。

public synchronized void setLoadsImagesAutomatically(boolean flag)


设置当前webview是否需要加载图片,这个标记控制整个webview的状态,并且对所有的资源都采取这种策略。如果设置为false 那么访问的当前网址中的所以图片资源将不会被加载。默认值是true;

public synchronized void setBlockNetworkImage (boolean flag)


当getLoadsImagesAutomatically返回true这个方法才有效, 默认值为:false;

public void setCacheMode(int mode)


一个普通网页的加载cache会被检查,内容也会被重新校验,第一次访问网页时,会存储cache到本地,设置策略可以让网页加载方式发生变化,cache模式有如下几种:

LOAD_DEFAULT: 如果我们应用程序没有设置任何cachemode, 这个是默认的cache方式。 加载一张网页会检查是否有cache,如果有并且没有过期则使用本地cache,否则 从网络上获取。

LOAD_CACHE_ELSE_NETWORK: 使用cache资源,即使过期了也使用,如果没有cache才从网络上获取。

LOAD_NO_CACHE: 不使用cache 全部从网络上获取

LOAD_CACHE_ONLY: 只使用cache上的内容。

public void setLoadWithOverviewMode(boolean overview)


概览模式的设置,默认指是false。

public synchronized void setJavaScriptEnabled (boolean flag)


默认值是false. 如果我们网页需要javascript时,需要开启这个设置,否则网页加载不全。

2.WebSettings Webkit中的实现

WebSeetings 的API在Android 系统各个版本变化不大只是增加API或者deprecate一些API,但其内部是实现在不同版本中确有些差异,目前主流android系统版本主要为Android 4.0以上,分析4.0以上各系统版本得出webseetings的实现分为三块Android 4.0, Android 4.1—4.3,Android 4.4。下面分析下Android 以上各版本间的实现:

1)Android 4.0系统 主要分为两部分,一部分是API层,另一部分Settings的存储位置。

Settings存储位置大部分的setting最终设置到WebCore当中的Settings.cpp, 比如javaScriptEnable等

还有一部分根据模块相关存储在模块内部,比如CacheMode存储在FrameLoader当中。

2)Android 4.1–4.3系统对WebView的 framework进行重构,WebSettings相应也跟着变化。

中间引入了桥阶层WebSettingsClassc。

Settings存储位置大部分的setting最终设置到WebCore当中的Settings.cpp, 比如javaScriptEnable等

还有一部分跟平台相关的存储在WebCoreSupport层相应模块中,比如在4.1—4.3上CacheMode存储在WebRequestContext

在Android 4.4上WebView底层实现换成了chromium,为了兼容老的WebSettings的接口,Android 4.4做了chromium 的桥阶层,主要涉及的WebSettings相关代码在

ContentSettingsAdapter,AwSettings中。

和前面的一些版本相同的是大部分settings还是存储在Webkit的Settings.cpp中,这边简单介绍下chromium 使用的blink渲染引擎,而blink是从webkit当中剥离出来的,还保留了webkit的parsing等。因此和我们之前看到的Settings.cpp存储在WebCore目录,目录结构会有所不同。

还有一部分settings在Android 4.4上存储方式也是存储在platform porting层。 下面是一个关于cachemode这个设置的分析:

参考资料:

http://developer.android.com/reference/packages.html#q=websettings

https://source.android.com/ Android 4.0—4.4

补充内容

webSettings.setBuiltInZoomControls(false);// 是否支持缩放

webSettings.setRenderPriority(RenderPriority.LOW);// 设置渲染级别

// 设置js可以直接打开窗口,如window.open(),默认为false
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

// 设置webView最大的缓存空间
webSettings.setAppCacheMaxSize(1024 * 1024 * 50);

// 是否启用缓存
webSettings.setAppCacheEnabled(true);

// 是否开启本地DOM存储
webSettings.setDomStorageEnabled(true);


总结

还有其他的api没有介绍,不过从命名上来看,理解上应该都是不难,不懂得话就去看看api的英文注解,都不会有太大问题。

感谢原博主的分享,讲解的真是非常的详细,看完这个三篇真是受益匪浅,必须收藏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息