Android 4.4 后 WebView 的改变

Android 4.4 开始,WebView 不再基于 WebKit ,而是基于 Chromium

这个改变使得 WebView 的性能大幅提升,并且对 HTML5CSSJavaScript 有了更好的支持

虽然 chromium 完全取代了以前的 WebKit for Android,但 Android WebViewAPI 接口并没有变,与老的版本完全兼容

但也有一些要注意的地方

多线程

在子线程中调用 WebView 的相关方法,而不在 UI 线程,可能会出现无法预料的错误

因此,如果使用 WebView 过程中会用到多线程,一定要调用 runOnUiThread() 方法来保证 WebView 的操作是在 UI线程 中进行的

runOnUiThread(newRunnable(){

    @Override
    public void run(){
        // Code for WebView goes here
    }
});

线程阻塞

永远不要阻塞 UI 线程,这是开发 Android 程序的一个真理

所以千万不要在 UI线程 中去等待 JavaScript 的回调

// 这是错误的,不友好的,会阻塞 UI 线程
webView.loadUrl("javascript:fn()"); 
while(result ==null) {  
    Thread.sleep(100); 
}

可以使用 evaluateJavascript() 异步执行 JavaScript 代码

evaluateJavascript() 方法

专门用于异步调用 JavaScript 方法,并且能够得到一个回调结果

mWebView.evaluateJavascript(script, new ValueCallback<String>() {
    @Override
     public void onReceiveValue(String value) {
        // code here
    }
});

处理 WebView 中 URL 的跳转

Android 4.4+ 版本对于 WebView 中自定义的 scheme 的 url 跳转,新增了更为严格的限制条件

即使实现了 shouldOverrideUrlLoading()shouldInterceptRequest() 回调,WebView 也只会在跳转 url 是合法 Url 时才会跳转

比如下面这个 URL

<a href="showProfile">我的</a>

shouldOverrideUrlLoading() 将不会被调用

正确的使用方式是

<a href="example-app:showProfile">Show Profile</a>

对应的检测 Url 跳转的方式是

privatestaticfinalString APP_SCHEME ="example-app:";

@Override 
publicboolean shouldOverrideUrlLoading(WebView view,String url){

     if(url.startsWith(APP_SCHEME)){

         urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");
         respondToData(urlData);
         returntrue;
     }
     returnfalse;
}

也可以这样使用

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,null,"UTF-8",null);

UserAgent 变化

Android 4.4+ WebView 的 UserAgent 有了些微妙的改变

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

可以使用 getDefaultUserAgent() 方法可以获取默认的 UserAgent

也可以通过

mWebView.getSettings().setUserAgentString(ua);
mWebView.getSettings().getUserAgentString();

来设置和获取自定义的 UserAgent

addJavascriptInterface()

Android 4.2+ 开始。 只有添加 @JavascriptInterface 声明的 Java 方法才可以被 JavaScript 调用

class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
}

webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.