Android與H5交互 原理與對比


原文:  https://www.jianshu.com/p/345f4d8a5cfa

1.Android調用JS的方法有2種: 

(1)通過WebView的loadUrl()

  // 調用js中的函數:jsFun(msg)
  webView.loadUrl("javascript:jsFun('" + msg + "')"); 


(2)通過WebView的evaluateJavascript()

  mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
    //此處為 js 返回的結果

     }
    });
  } 

  a)、比第一種方法效率更高、使用更簡潔,因為該方法的執行不會使頁面刷新,而第一種方法(loadUrl )的執行則會。

  b)、Android 4.4 后才可使用 

  

結論:

建議兩種方法混合使用,即Android 4.4以下使用loadUrl,Android 4.4以上evaluateJavascript

 

2.JS調用Android的方法有3種:

(1)通過WebView的addJavascriptInterface()進行映射

  a)被JS調用的方法必須加入@JavascriptInterface注解

  b) 存在嚴重的漏洞問題


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

  a)Android通過 WebViewClient 的回調方法shouldOverrideUrlLoading ()攔截 url

  b)解析該 url 的協議, 如果檢測到是預先約定好的交互協議,就調用相應方法 

  • 優點:不存在方式1的漏洞;
  • 缺點:JS獲取Android方法的返回值復雜。 如果JS想要得到Android方法的返回值,只能通過 WebView 的 loadUrl ()去執行 JS 方法把返回值再傳遞給H5.


(3)通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息
原理:Android通過 WebChromeClient 的onJsAlert()onJsConfirm()onJsPrompt()方法回調分別攔截JS對話框 (即上述三個方法),得到他們的消息內容,然后解析, 和方法(2)類似處理。

 

  a)常用的攔截:攔截 JS的提示框(即prompt()方法),因為onJsPrompt調用較少,而onJsAlert、onJsConfirm調用頻繁

  b) 只有prompt()可以返回任意類型的值,操作最全面方便、更加靈活;而alert()對話框沒有返回值;confirm()對話框只能返回兩種狀態(確定 / 取消)兩個值

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM