Android开发 之 WebView的版本变化

本文介绍了Android系统中WebView从5.0到8.0的主要版本变化。5.0版本升级到Chromium M37,增强了安全性和稳定性,支持getUserMedia()等API。6.0版本无显著变化,7.0开始Chrome APK负责WebView渲染,减少内存和带宽使用。8.0引入多种API以提升WebView的稳定性和安全性,如Version API、Google SafeBrowsing API等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WebView的版本变化

5.0的变化:

WebView 更新

Android 5.0 将 WebView 实现更新至 Chromium M37,增强了安全性和稳定性,并修复了一些问题。运行在 Android 5.0 上的 WebView 的默认用户代理字符串已更新,以纳入 37.0.0.0 作为版本号。

此版本引入了 PermissionRequest 类,让您的应用可以通过 getUserMedia() 等网络 API 授予 WebView 访问相机和麦克风之类受保护资源的权限。您的应用必须对这些资源拥有相应的 Android 权限,才能向 WebView 授予权限。

借助新的 onShowFileChooser() 方法,您现在可以在 WebView 中使用输入表单字段,然后启动文件选择器从 Android 设备中选择图像和文件。

此外,此版本还提供了对 WebAudioWebGL 和 WebRTC 开放标准的支持。要详细了解此版本包含的新功能,请参阅 WebView for Android

6.0没有变化

7.0的变化:基本上开发者不用做任何事情

Chrome 和 WebView 配合使用

从 Android 7.0 及更高版本中的 Chrome 版本 51 开始,您的设备中的 Chrome APK 用于提供和渲染 Android 系统 WebView。这种方法改善了设备本身的内存使用率,同时减少保持 WebView 更新所需的带宽(因为只要保持启用 Chrome,单机版 WebView APK 将不再进行更新)。

您可以启用开发者选项和选择 WebView 实现,选择您的 WebView 提供商。您可以使用设备上安装的任何兼容的 Chrome 版本(Dev、Beta 或 Stable)或单机版 Webview APK,作为 WebView 实现。


8.0的变化:

Android 8.0 提供多种 API,帮助您管理在应用中显示网页内容的 WebView 对象。这些 API 可增强应用的稳定性和安全性,它们包括:

  • Version API
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API

要详细了解如何这些 API,请参阅管理 WebView

1) 增加了版本api
if(Build.VERSION.SDK_INT ==26 )
        {
            PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
            Log.e("packageinfo",webViewPackageInfo.versionName+"");

        }

注意:WebView.getCurrentWebViewPackage()方法可以返回null如果 设备没有被正确设置。 它还返回null如果 你运行你的应用程序在设备上不支持WebView,比如一个Android设备磨损

2) 安全浏览api,为您的用户提供更安全的上网体验,您可以配置 你的应用程序WebView对象来验证url使用谷歌安全浏览。 当启用了安全措施,应用程序显示用户时的一个警告 试图导航到一个潜在的不安全的网站。

选择你的WebView对象检查url 谷歌安全浏览不安全的网站列表,添加以下<meta-data>元素应用程序清单文件:
<manifest>
    <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
               android:value="true" />
    ...
    <application> ... </application>
</manifest

3)终止处理api
这个API处理情况的渲染器的过程WebView对象消失,要么因为系统 杀死了渲染器回收或急需的内存,因为渲染器 过程本身坠毁。 通过使用这个API,您允许应用程序继续 执行,即使渲染器过程已经消失。

警告:如果你的应用程序后继续执行 渲染器消失过程,相关的实例WebView不能被重用,无论渲染器 进程被杀或崩溃。 你的应用程序必须从视图中删除实例 层次结构和破坏实例继续执行。 然后,应用程序必须 创建一个全新的实例WebView继续 呈现web页面。

要知道,如果一个渲染器崩溃而加载一个特定的web页面, 再次试图加载相同的页面可能会导致一个新的WebView对象表现出相同的呈现崩溃 的行为。
public class MyRendererTrackingWebViewClient extends WebViewClient {
        private WebView mWebView;
        @Override
        public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
            if (!detail.didCrash()) {
                //由于系统内存不足,渲染器被杀死。应用程序可以通过在前台创建一个新的WebView实例来优雅地恢复。
                Log.e("MY_APP_TAG", "System killed the WebView rendering process " +
                        "to reclaim memory. Recreating...");
                if (mWebView != null) {
                    ViewGroup webViewContainer =
                            (ViewGroup) findViewById(R.id.my_web_view_container);
                    webViewContainer.removeView(mWebView);
                    mWebView.destroy();
                    mWebView = null;
                }

                // By this point, the instance variable "mWebView" is guaranteed
                // to be null, so it's safe to reinitialize it.
                //到这一点,实例变量“mWebView”被保证为null,所以重新初始化它是安全的。

                return true; // The app continues executing.该应用程序继续执行。

                //在此示例中,应用程序在检测到渲染器崩溃后崩溃。 如果您选择更优雅地处理崩溃并允许您的应用程序继续执行,则应该
                // 1)销毁当前的WebView实例,2)指定应用程序如何继续执行的逻辑,3)返回“true”。
            }

            // Renderer crashed because of an internal error, such as a memory
            // access violation.
            //渲染器因内部错误(如内存访问冲突)而崩溃。
            Log.e("MY_APP_TAG", "The WebView rendering process crashed!");
            return false;
        }
    }
4)渲染器API的重要性
现在,WebView对象在多进程运行 模式,你有你的应用程序如何处理内存不足的灵活性 的情况。 您可以使用渲染器API的重要性,介绍了在Android 8.0中, 设置渲染器分配给优先政策 特定的WebView对象。 特别是,你可能想要的 你的应用程序的主要部分继续执行显示当一个渲染器 你的应用程序WebView对象被杀。 你可能会这样做, 例如,如果您希望不显示WebView对象 在很长一段时间,这样的系统可以回收内存 渲染器使用。

下面的代码片段显示了如何优先分配给渲染器 与应用程序相关的过程WebView对象:

myWebView.setRendererPriorityPolicy(WebView.RENDERER_PRIORITY_BOUND, true);

在这个特殊的片段,渲染器的优先级是一样的(或“ 会”)应用程序的默认优先级。true论点 减少渲染器的优先级RENDERER_PRIORITY_WAIVED当 相关联的WebView对象不再是可见的。 在 句话说,true论证表明,不在乎你的应用 过程系统使渲染器是否活着。 事实上,这更低 优先级,使得渲染器有可能过程中丧生 内存不足的情况。

警告:保持应用程序稳定,你不应该 改变渲染器优先政策WebView对象 除非你也用终止处理API指定如何WebView反应时相关 渲染器消失。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值