1. 程式人生 > >Android呼叫js方法以及js呼叫Android方法

Android呼叫js方法以及js呼叫Android方法

Android的一般使用WebView.loadUrl(url);載入指定的|網頁檔案展示,並且可以實現的JavaScript指令碼與本地的Java程式碼的互動。

1、Android 的WebView載入html頁面

       WebView myWebView = (WebView) findViewById(R.id.myWebView);
       //允許WebView執行JavaScript
myWebView.getSettings().setJavaScriptEnabled(true);
       //把js繫結到全域性的XJYJS上,讓JS可以訪問JavaScriptinterface中的方法, JavaScriptinterface中也可以呼叫JS中的方法。XJYJS 是與JS約定的 (隨便起就行),作用是:JS可以通過 window.XJYJS.getMsg() 呼叫 JavaScriptinterface中的getMsg(),該方法須新增
@JavascriptInterface註解
        myWebView.addJavascriptInterface(new JavaScriptinterface(this,myWebView ),"XJYJS");
myWebView.setWebViewClient(new WebViewClient());
       myWebView.loadUrl(url);

2、建立JavaScriptinterface類

publicclass JavaScriptinterface {
    Context context;
    public JavaScriptinterface(Context c,WebView mWebView) {
        context
= c; } /** * 與js互動時用到的方法,在js裡直接呼叫的(window.XJYJS.getMsg(str)) */ @JavascriptInterface publicvoid getMsg() {
String string = "原生給JS的資料";
call = "javascript:showMsg(\"" + string + "\")";
mWebView.post(new Runnable() {
    @Override
    public void run() {

        mWebView.loadUrl(call);
    
}});
}
}
3、html程式碼 
<HTML>  
<HEAD>  
<meta name="viewport" content="width=device-width, target-densitydpi=device-dpi" />  
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<script>  
   function showMsg(res){
      alert(res);
   }   
</script>  
</HEAD>  
<BODY>  
<span>測試js使用</span>
  <button id='btntest' onclick='window.myjs.getMsg()'>JS呼叫原生方法</button>
</BODY>  
</HTML> 
4、AndroidManifest.xml中加許可權   
<uses-permission android:name="android.permission.INTERNET"/>
總結:
以上是Android在4.4之前並沒有提供直接呼叫js函式並獲取值的方法,所以在此之前,常用的思路是java呼叫js方法,js方法執行完畢,再次呼叫java程式碼將值返回。
Android 4.4之後使用evaluateJavascript即可。這裡展示一個簡單的互動示例具有返回值的js方法。
JS程式碼
function getMsg(){return1;}

Android的程式碼時用evaluateJavascript方法呼叫

privatevoid testEvaluateJavascript(WebView webView){
  webView.evaluateJavascript("getMsg()",newValueCallback<String>(){@Overridepublicvoid onReceiveValue(String value){Log.i(LOGTAG,"onReceiveValue value="+ value);}});}

輸出結果

onReceiveValue value=1
evaluateJavascript方法必須在UI執行緒(主執行緒)呼叫,因此onReceiveValue也執行在主執行緒。
參考的部落格:http://www.jianshu.com/p/4542be29807e