BAT大咖助力Android面试5-WebView面试详解

五,WebView面试详解

这里写图片描述

1,简介

WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。

2,作用

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

3,方法

(1),常用方法

  • webView.onResume();激活WebView为活跃状态

  • webView.onPause(); 暂停WebView所有动作

  • webView.pauseTimers();结合webView.onPause()使用

  • webView.resumeTimers();结合
    webView.onResume()使用

总结:onResume和onPause是针对当前webview,pauseTimers和resumeTimers是针对应用所有webview,常配套使用

参考自https://blog.csdn.net/goldenfish1919/article/details/38435799

  • Webview.goBack() 后退网页
  • Webview.goForward() 前进网页
  • Webview.goBackOrForward(intsteps)
    以当前的index为起始点前进或者后退到历史记录中指定的steps
    如果steps为负数则为后退,正数则为前进

(2),WebSettings类方法

参见
https://blog.csdn.net/carson_ho/article/details/52693322

(3),WebViewClient类方法

常见方法1:shouldOverrideUrlLoading()
作用:打开网页时不调用系统浏览器, 而是在本WebView中显示;在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。

常见方法2:onPageStarted()
作用:开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。

常见方法3:onPageFinished()
作用:在页面加载结束时调用。我们可以关闭loading 条,切换程序动作。

常见方法4:onLoadResource()
作用:在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

常见方法5:onReceivedError()
作用:根据错误类型,处理错误信息

常见方法6:onReceivedSslError()
作用:处理https请求

(4),WebChromeClient类

常见方法1: onProgressChanged()
作用:获得网页的加载进度并显示

常见方法2: onReceivedTitle()
作用:获取Web页中的标题

4,WebView与JS的交互

参考自:https://blog.csdn.net/carson_ho/article/details/64904691

对于Android调用JS代码的方法有2种:
1. 通过WebView的loadUrl()
2. 通过WebView的evaluateJavascript()

对于JS调用Android代码的方法有3种:
1. 通过WebView的addJavascriptInterface()进行对象映射
2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

5,如何避免WebView内存泄露?

(1),动态添加WebView,对传入WebView中使用的Context使用弱引用

  • 不在xml中定义 Webview ,而是在需要的时候在Activity中创建,并且Context使用 getApplicationgContext()
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mWebView = new WebView(getApplicationContext());
        mWebView.setLayoutParams(params);
        mLayout.addView(mWebView);
  • 在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空。
@Override
    protected void onDestroy() {
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebView.clearHistory();

            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }

(2),独立进程

此方法简单暴力,就是开启单独一个进程给WebView,不过可能涉及到进程间通信,这会比较麻烦。
WebView使用完后直接干掉此进程,使app的主进程减少一些内存容量。

6,注意

(1),WebView的 onPageFinished方法
问题描述: WebView加载的页面完成时会回调onPageFinished方法,但是此方法有很多坑,它会判断此网页是否真的加载完毕,若此时在加载过程中产生跳转,此方法会被调用无数次

解决方法:所以当你的WebView需要加载各种网页并且需要在网页上完成一些操作时,推荐使用WebView 的 onProgressChanged 方法,此方法相较于之前的更为稳定、靠谱。

(2),WebView带来的 后台耗电隐患
问题描述:当我们使用到WebView加载网页时,WebView会自己开启线程,如果在使用完后没有彻底销毁,这些残余的线程会一直在后台运行导致应用程序大幅度耗电。

解决方法:这里提供一个方法,有些暴力,仅做思考:在Activity的onDestory方法中调用System.exit直接把虚拟机关闭。

(3),WebView硬件加速导致 页面渲染问题
问题描述:硬件加速开始于Android 系统3.0,开启硬件加速后,WebView渲染页面加速,拖动起来效果更加顺滑。但是这里有一个问题,容易出现加载页面白块、界面闪烁的现象。

解决方法设置WebView暂时关闭硬件加速

(4),jsbridge
在此简介其概念:它通过JavaScript来构建桥,桥的其中一端是Web端,另一端是客户端native,而搭桥的目的是为了本地native端调用Web的js代码,同时Web端可以调用本地native代码,仅做了解即可。

是H5页面中全局对象window的一个属性,形如:
var JSBridge = window.JSBridge || (window.JSBridge = {});

https://blog.csdn.net/ejinxian/article/details/66971175

(5),WebView 的 addJavascriptInerface方法带来的 安全漏洞
Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用 WebView.addJavascriptInerface方法,远程攻击者可通过使用 Java Reflection API 利用该漏洞执行任意Java对象的方法。

此方法addJavascriptInerface给WebView加入了一个Javascript桥接口,而此桥接口可以通过调用来操纵本地的Java接口。这是前几年WebView出现问题十分显著的一次,攻击者利用反射机制调用未注册的其它Java类,导致操纵JavaScript能力无限增强,攻击者利用此漏洞对客户端任意篡改,甚至进行违法行为。

猜你喜欢

转载自blog.csdn.net/superjunjin/article/details/80180494
今日推荐