Skip to content

6.4 webView基础4

杨充 edited this page Jun 5, 2020 · 2 revisions

基础使用目录介绍

  • 41.管理Cookies分析说明
  • 42.WebView中长按处理逻辑
  • 43.8.0关于WebView新特性
  • 44.H5页面为何加载速度慢
  • 45.shouldOverrideUrlLoading返回值
  • 47.WebView多布局连贯滑动
  • 48.开启Google安全浏览服务
  • 50.webView使用上的建议

41.管理Cookies分析说明

  • Cookie的作用
    • Cookie 是服务器发送到用户浏览器并保存在浏览器上的一块数据,它会在浏览器下一次发起请求时被携带并发送到服务器上。
    • 可通过Cookie保存浏览信息来获得更轻松的在线体验,比如保持登录状态、记住偏好设置,并提供本地的相关内容。
  • 会话Cookie 与 持久Cookie
    • 会话cookie不需要指定Expires和Max-Age,浏览器关闭之后它会被自动删除。
    • 持久cookie指定了Expires或Max-Age,会被存储到磁盘上,不会因浏览器而失效。
  • 第一方Cookie 与 第三方Cookie
    • 每个Cookie都有与之关联的域,与页面域一样的就是第一方Cookie,不一样的就是第三方Cookie。
    // 设置接收第三方Cookie
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CookieManager.getInstance().setAcceptThirdPartyCookies(vWeb, true);
    }
    

42.WebView中长按处理逻辑

  • 大概的步骤如下
    • 给 WebView添加监听
    • 获取点击的内容信息
    • 操作
  • 具体代码如下所示
    this.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            WebView.HitTestResult result = ((WebView)v).getHitTestResult();
            if (null == result){
                return false;
            }
            int type = result.getType();
            if (type == WebView.HitTestResult.UNKNOWN_TYPE){
                return false;
            }
            // 这里可以拦截很多类型,我们只处理图片类型就可以了
            switch (type) {
                case WebView.HitTestResult.PHONE_TYPE: // 处理拨号
                    break;
                case WebView.HitTestResult.EMAIL_TYPE: // 处理Email
                    break;
                case WebView.HitTestResult.GEO_TYPE: // 地图类型
                    break;
                case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超链接
                    break;
                case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项
                    break;
                default:
                    break;
            }
            return true;
        }
    });
    
  • type有这几种类型:
    • WebView.HitTestResult.UNKNOWN_TYPE 未知类型
    • WebView.HitTestResult.PHONE_TYPE 电话类型
    • WebView.HitTestResult.EMAIL_TYPE 电子邮件类型
    • WebView.HitTestResult.GEO_TYPE 地图类型
    • WebView.HitTestResult.SRC_ANCHOR_TYPE 超链接类型
    • WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE 带有链接的图片类型
    • WebView.HitTestResult.IMAGE_TYPE 单纯的图片类型
    • WebView.HitTestResult.EDIT_TEXT_TYPE 选中的文字类型

43.8.0关于WebView新特性

  • WebView新增了一些非常有用的API,可以使用和chrome浏览器类似的API来实现对恶意网站的检测来保护web浏览的安全性,为此需要在manifest中添加如下meta-data标签:
    <manifest>
    <meta-data
        android:name="android.webkit.WebView.EnableSafeBrowing"
        android:value="true" />
    <!-- ... -->
    </manifest>
    
  • WebView还增加了关于多进程的API,可以使用多进程来增强安全性和健壮性,如果render进程崩溃了,你还可以使用Termination Handler API来检测到崩溃并做出相应处理。

44.H5页面为何加载速度慢

  • webView是怎么加载网页的呢?
    • webView初始化->DOM下载→DOM解析→CSS请求+下载→CSS解析→渲染→绘制→合成
  • 渲染速度慢
    • 前端H5页面渲染的速度取决于 两个方面:
      • Js 解析效率。Js 本身的解析过程复杂、解析速度不快 & 前端页面涉及较多 JS 代码文件,所以叠加起来会导致 Js 解析效率非常低
      • 手机硬件设备的性能。由于Android机型碎片化,这导致手机硬件设备的性能不可控,而大多数的Android手机硬件设备无法达到很好很好的硬件性能
    • 总结:上述两个原因 导致 H5页面的渲染速度慢。
  • 页面资源加载缓慢
    • H5 页面从服务器获得,并存储在 Android手机内存里:
      • H5页面一般会比较多
      • 每加载一个 H5页面,都会产生较多网络请求:
        • HTML 主 URL 自身的请求;
        • HTML外部引用的JS、CSS、字体文件,图片也是一个独立的 HTTP 请求
      • 每一个请求都串行的,这么多请求串起来,这导致 H5页面资源加载缓慢
  • 总结:H5页面加载速度慢的原因:渲染速度慢 & 页面资源加载缓慢 导致。

45.shouldOverrideUrlLoading返回值

  • 返回值是什么意思?
    • 不准确的说法如下:
      • 1.返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
      • 2.返回: return true; 表示webView处理url是根据程序来执行的。 返回: return false; 表示webView处理url是在webView内部执行。
    • 准确说法,该方法说明如下所示:
      • 1.若没有设置 WebViewClient 则由系统(Activity Manager)处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
      • 2.1若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理,也就是程序员自己做处理。
      • 2.2若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。
  • 该方法何时调用
    • WebView的前进、后退、刷新、以及post请求都不会调用shouldOverrideUrlLoading方法
    • 除去以上行为,还得满足( ! isLoadUrl || isRedirect)即(不是通过webView.loadUrl来加载的 或者 是重定向) 这个条件,才会调用shouldOverrideUrlLoading方法。
  • 一些词汇解释
    • isRedirect就是重定向的url,即重定向url也会触发shouldOverrideUrlLoading;
    • isLoadUrl是什么意思?凡是webView.loadUrl出load页面的,isLoadUrl都是true(原因是webView.loadUrl最终会调到loadUrl(LoadUrlParams params),进而params.setTransitionType(params.getTransitionType() | PageTransition.FROM_API)).
  • 参考文章

47.WebView多布局连贯滑动

48.开启Google安全浏览服务

  • 为向用户提供更安全的浏览体验,您的 WebView 对象会使用 Google 安全浏览(可让应用在用户尝试访问可能不安全的网站时向用户显示警告)验证网址。
  • 当 EnableSafeBrowsing 的默认值为 true 时,在某些情况下,您可能有时会希望仅根据条件启用安全浏览功能或停用此功能。Android 8.0(API 级别 26)及更高版本支持使用 setSafeBrowsingEnabled() 来针对单个 WebView 对象启用或停用安全浏览。
  • 如果您希望所有 WebView 对象都选择停用安全浏览检查,则向应用的清单文件添加以下 元素即可实现这一点:
    <manifest>
        <application>
            <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                       android:value="false" />
            ...
        </application>
    </manifest>
    

50.webView使用上的建议

  • 将布局高度和宽度设置为 match_parent
    • 将 WebView 对象的高度和宽度设置为 match_parent 可以确保应用视图的尺寸合适。我们建议不要将高度设置为 wrap_content,因为它会导致尺寸不正确;在以 Android 4.4(API 级别 19)及更低版本为目标平台的应用中,系统会忽略 HTML 视口元标记以维持向后兼容性。同样,不支持将布局宽度设置为 wrap_content,这会导致 WebView 改用其父级的宽度。由于这一行为,请也务必确保 WebView 对象的父级布局对象的高度和宽度均未设置为 wrap_content。
  • 避免多个文件请求
    • 由于移动设备的连接速度通常远远低于桌面设备,因此您应尽可能提高网页加载速度。提高网页加载速度的一种方法是,避免在 中加载样式表和脚本文件等额外文件。优化移动设备上网页加载速度的更有效方法是,利用 Google 的 PageSpeed Insights 进行移动设备浏览体验分析。如果您希望优化应用的性能,请参阅 PageSpeed Insights 规则。