Android API Guides---Migrating to WebView in Android 4.4

来源:互联网 发布:可爱彩虹图片 知乎 编辑:程序博客网 时间:2024/06/06 01:46
Android 4.4系统(API级别19)引入的WebView的新版本是基于铬。这对HTML5,CSS3和JavaScript的变化升级的WebView性能和标准的支持,以配合最新的网络浏览器。使用的WebView将继承这些升级在Android 4.4及更高版本运行时,任何应用。


本文档描述了的WebView其他更改,你应该知道,如果你设置你的targetSdkVersion为“19”或更高。


注意:如果您targetSdkVersion设置为“18”或更低,网页视图中的“怪癖模式”才能进行操作,以避免一些下面描述的行为的变化,尽可能密切,同时还提供您的应用程序的性能和Web标准升级。要小心,虽然,单一狭隘列布局和默认缩放级别并不支持Android 4.4系统,并且有可能是尚未确定的其他行为上的差异,所以一定要上测试Android 4.4的应用程序或即使更高你把你的targetSdkVersion设置为“18”或更低。


为了帮助您通过Android 4.4的迁移应用的WebView时可能遇到的任何问题,则可以通过调用setWebContentsDebuggingEnabled能够通过浏览器在桌面上远程调试()。在WebView中这个新功能可以让你检查,并在WebView中运行时分析你的网页内容,脚本和网络活动。欲了解更多信息,请参阅在Android远程调试。


用户代理的变化


如果基于用户代理服务内容到您的WebView,你应该要知道用户代理字符串略有改变,现在包括Chrome版本:

Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H) AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
如果你需要获取用户代理,但并不需要将其存储为您的应用程序或不想实例的WebView,你应该使用静态方法,getDefaultUserAgent()。但是,如果你打算重写你的WebView用户代理字符串,你可能反而要使用setUserAgentString()。
多线程和线程阻塞
如果您不是您的应用程序的UI线程以外的任何线程中调用上的WebView方法,它可能会导致意想不到的结果。例如,如果您的应用程序使用多线程,则可以使用runOnUiThread()方法,以确保您的代码执行的UI线程上:

runOnUiThread(new Runnable() {    @Override    public void run() {        // Code for WebView goes here    }});
另外要确保你永远不会阻塞UI线程。其中一些应用程序会犯这种错误有一种情况是在等待JavaScript回调。例如,不要使用这样的代码:

// This code is BAD and will block the UI threadwebView.loadUrl("javascript:fn()");while(result == null) {  Thread.sleep(100);}
您可以改用一种新的方法,evaluateJavascript(),异步运行JavaScript。


自定义URL处理


新的WebView请求资源和解决使用自定义URL方案链接时,适用附加限制。例如,如果您实现回调,如shouldOverrideUrlLoading()或shouldInterceptRequest(),然后调用的WebView他们只对有效的URL。


如果您正在使用自定义URL方案或基本URL,并注意您的应用程序接收更少的调用这些回调或无法加载在Android4.4的资源,确保请求指定符合RFC 3986的有效网址。


例如,新的WebView可能不要求像这样的链接你的shouldOverrideUrlLoading()方法:

<a href="showProfile">Show Profile</a>
用户点击这样的链接可以不同的结果:


如果用无效的或空基URL调用loadData()或loadDataWithBaseURL()加载的页面,那么你将不会收到shouldOverrideUrlLoading()回调页面上此类型的链接。
注意:当您使用loadDataWithBaseURL()和基础URL无效或设置为空值,在内容的各个环节要装入必须是绝对的。


如果通过调用使用loadURL(页面加载)或loadDataWithBaseURL()提供了有效的基础URL,那么您将收到shouldOverrideUrlLoading()回调对于这种类型的页面上的链接,但您会收到该URL将是绝对的,相对当前页面。例如,您会收到URL将是“http://www.example.com/showProfile”,而不只是“showProfile”。
相反,如上图所示的使用一个链接一个简单的字符串,可以使用自定义方案,如下列

<a href="example-app:showProfile">Show Profile</a>
然后,您可以在这样的shouldOverrideUrlLoading()方法处理这个网址:

// The URL scheme should be non-hierarchical (no trailing slashes)private static final String APP_SCHEME = "example-app:";@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {    if (url.startsWith(APP_SCHEME)) {        urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");        respondToData(urlData);        return true;    }    return false;}
你不能改变的HTML,那么你可能能够使用loadDataWithBaseURL(),并设置一个基本的URL由定制方案和有效的主机,如“例如应用:// <valid_hostname>/”。 例如:

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,        null, "UTF-8", null);
有效主机名应符合RFC 3986,并在末尾最后的斜线,否则,从页面加载任何请求可能被丢弃是很重要的。


视口的变化


视目标densitydpi不再支持


此前,支持网页视图称为目标densitydpi帮助网页指定所需的屏幕像素密度视口属性。这个属性不再支持,你应该迁移到使用具有图像和CSS标准的解决方案,在WebView中像素完美的用户界面的讨论。


视口放大,当小


以前,如果您的视口宽度设置为小于一个值或等于“320”,将被设置为“设备宽度”,如果你在视口的高度设定为小于或等于所述web视图高度的值,它将被设置为“设备高度”。然而,在新的web视图运行时,宽度或高度值被粘附和web视图放大以填充屏幕宽度。


多视口标签不支持


以前,如果你在网页中包含多个视标签的WebView将从所有标记合并属性。在新的WebView,只使用最后一个视口和所有其他被忽略。


默认缩放已过时


方法getDefaultZoom()和setDefaultZoom()用于获取和设置页面上的初始缩放级别已经不再支持,您应该定义在网页中适当的视口。


注意:这些API不支持Android 4.4系统,并在所有更高。即使你targetSdkVersion设置为“18”或更低时,这些API没有任何效果。


有关如何定义在HTML中视属性的信息,在网页视图读取像素完美的用户界面。


如果你不能设置在HTML中的视口的宽度,那么你应该调用setUseWideViewPort(),以确保该页面被赋予更大的视口。例如:

WebSettings settings = webView.getSettings();settings.setUseWideViewPort(true);settings.setLoadWithOverviewMode(true);
造型变化


背景简写覆盖背景大小


Chrome和其他浏览器所不欲这样一段时间,但现在的WebView也将覆盖背景大小的一个CSS设置如果您还指定背景样式。例如,这里的大小将被重置为默认值:

.some-class {  background-size: contain;  background: url('images/image.png') no-repeat;}
解决方法是简单地切换左右两个属性。

.some-class {  background: url('images/image.png') no-repeat;  background-size: contain;}
尺寸是CSS像素,而不是屏幕像素
此前,大小等参数window.outerWidth和window.outerHeight返回实际屏幕像素值。在新的WebView,这些返回基于CSS像素值。
这是一般不好的做法,试图计算像素的物理尺寸大小为元素或其它计算。但是,如果您已经禁用变焦和初始比例设置为1.0,则可以使用window.devicePixelRatio得到规模化,然后由乘以CSS像素值。相反,你也可以创建一个JavaScript绑定查询从自身的WebView的像素大小。
欲了解更多信息,请参阅quirksmode.org。
窄柱和SINGLE_COLUMN不再支持
对于WebSettings.LayoutAlgorithm狭窄的一个字段的值不会在新的WebView支持。
注意:这些API不支持Android 4.4系统,并在所有更高。即使你targetSdkVersion设置为“18”或更低时,这些API没有任何效果。
您可以处理在以下方面这种变化:
改变风格的应用程序:
如果你有HTML和CSS网页上的控制,你会发现改变你的内容的设计可能是最可靠的方法。例如,对于在那里你举许可证屏幕,你可能需要一个<pre>标记,你可以用下面的方式做内包装的文字:

<pre style="word-wrap: break-word; white-space: pre-wrap;">
如果您还没有定义为您的网页视性质,这可能是特别有用。
使用新的自动调整文字大小布局算法:
如果您在使用窄列作为一种方法,使桌面网站的广谱移动设备上更具可读性,你是不是能够改变HTML内容,新的自动调整文字大小算法可能是一个合适的替代NARROW_COLUMNS。
此外,SINGLE_COLUMN值这是以前弃用-也没有在新的web视图支持。
在JavaScript中处理触摸事件
如果你的网页是直接处理在网页视图触摸事件,确保你也处理touchcancel事件。有几个场景中touchcancel将被调用,这可能会导致问题,如果没有收到:
一个元素被触摸(所以touchstart和touchmove的称呼)和页面滚动,从而导致抛出一个touchcancel。
一个元素被触摸(touchstart叫),但event.preventDefault()不被调用,从而导致早期足够touchcancel被抛出(这样的WebView假设你不想消耗触摸事件)。

0 0