Webview基礎知識

1、Webview的最常用的工具類:

WebViewClient類、WebChromeClient類

1.1、WebViewClient類

WebViewClient主要用來輔助WebView處理各種通知、請求等事件

onLoadResource
onPageFinished
onPageStarted
onReceivedError
shouldOverrideUrlLoading

若沒有設置 WebViewClient 則由系統(Activity Manager)處理該 url,通常是使用瀏覽器打開或彈出瀏覽器選擇對話框。
若設置 WebViewClient 且該方法返回 true ,則說明由應用的代碼處理該 url,WebView 不處理,也就是程序員自己做處理。
若設置 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url,即用 WebView 加載該 url。

1.2、WebViewClient類WebChromeClient類

WebChromeClient主要用來輔助WebView處理Javascript的對話框、網站圖標、網站標題以及網頁加載進度等。

onProgressChanged
onReceivedTitle
onJsAlert
onConsoleMessage

2、Android執行JS代碼的方法有2種:

2.1、通過WebView的loadUrl()

優勢:無版本限制

缺點是無法在JS代碼執行完成之後,進行回調。
可通過在JS代碼尾端打印完成的consoleMessage,我們通過WebChromeClient的onConsoleMessage去監聽這個message,執行相應回調。

2.2、通過WebView的evaluateJavascript()

缺點:4.4以上版本才能使用。
優勢:可以傳入一個回調對象,JS代碼執行完成之後,可直接回調。

爲了版本兼容,兩種方式可配合使用。
4.4以上版本使用evaluateJavascript(),以下使用loadUrl() 。

3、JS調用Android代碼的方法有3種:

3.1、通過WebView的addJavascriptInterface()進行對象映射

缺點:Android 4.2 版本以下存在安全漏洞

webView.addJavascriptInterface(new JSObject(), "myObj");

myObj.getClass().forName(" java.lang.Runtime “)

function execute(cmdArgs)  
{  
    // 步驟1:遍歷 window 對象
    // 目的是爲了找到包含 getClass ()的對象
    // 因爲Android映射的JS對象也在window中,所以肯定會遍歷到
    for (var obj in window) {  
        if ("getClass" in window[obj]) {  

      // 步驟2:利用反射調用forName()得到Runtime類對象
       alert(obj);          
       return  window[obj].getClass().forName("java.lang.Runtime")  

      // 步驟3:以後,就可以調用靜態方法來執行一些命令,比如訪問文件的命令
     getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);  

     // 從執行命令後返回的輸入流中得到字符串,有很嚴重暴露隱私的危險。
     // 如執行完訪問文件的命令之後,就可以得到文件名的信息了。
        }  
    }  
}   

Google 在Android 4.2 版本中規定對被調用的函數以 @JavascriptInterface進行註解從而避免漏洞攻擊

3.2、 通過 WebViewClient 的shouldOverrideUrlLoading ()方法回調攔截 url

3.3、 通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息

特別注意:JS代碼調用一定要在 onPageFinished() 回調之後才能調用,否則不會調用。

4、Android WebView自帶的緩存機制有5種:

瀏覽器 緩存機制
Application Cache 緩存機制
Dom Storage 緩存機制
Web SQL Database 緩存機制
Indexed Database 緩存機制

WebView緩存對於android端來說只需要調用對應方法開啓就行了,具體使用緩存由h5頁面完成

5、WebView內存泄漏

泄漏引用鏈:mComponentCallbacks->AwContents->BaseWebView->BookDetailActivity

WebView在onAttachedToWindow中會向application註冊一個mComponentCallbacks,以監聽內存不足等情況。
在onDetachedFromWindow時會反註冊,但是反註冊的前提是webview沒有destory。

所有我們在調用WebView.destroy()之前需要將WebView從其父容器中移除。

  ViewParent parent = mWebView.getParent();
    if (parent != null) {
        ((ViewGroup) parent).removeView(mWebView);
    }
 mWebView.destroy();
if (isDestroyed()) return;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章