Android呼叫js方法以及js呼叫Android方法
阿新 • • 發佈:2019-02-19
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