介紹
在android開發項目中,我們經常會將一些功能放在html中,比如一些活動界面,版權界面之類的,或者分了分流一下視頻區的流量,可能會在流量大的時候,打開web的接口。這時我們知道使用html界面要用到webview,而使用android時也需要注意與非源生的交互,就是android和js的互相調用。
配置
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/web.html");
這里首先讓webview支持javascript,然后作為demo直接加載本地的html。
android調用js方法
直接在onclick事件中寫
webView.loadUrl("javascript:javacalljs()");
webView.loadUrl("javascript:javacalljswith(" + "'參數'" + ")");
string就是js的方法名。
對應js的代碼
function javacalljs(){
document.getElementById("content").innerHTML =
"<br\>JAVA調用了JS的無參函數";
}
function javacalljswith(arg){
document.getElementById("content").innerHTML =
("<br\>"+arg);
}
js調用java
我們先看下js代碼
<input type="button" value="js調用java" onclick="window.android.startFunction()" />
<input type="button" value="js調用java傳遞參數" onclick="window.android.startFunction('參數')" />
在android中我們需要使用addJavascriptInterface方法添加js的方法。
webView.addJavascriptInterface(MainActivity.this, "android");
android就是js中對應的命名空間
以下我們可以直接在MainActivity里面寫注解方法:
@JavascriptInterface
public void startFunction(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
@JavascriptInterface
public void startFunction() {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
或者我們將js方法全部寫在一個類里面,比如JsonObject。
實例化的時候將 context和handler傳過去,用于上下文和回調。
jsObject = new JsObject(MainActivity.this,mHandler);
在添加接口時將對象傳入:
webView.addJavascriptInterface(jsObject, "android");
然后直接在jsonObject類下寫注解方法即可,再用handler回調,這樣方便管理。
其他
如果我們多次addJavascriptInterface的時候,在對象不同的情況下,比如我們先
webView.addJavascriptInterface(MainActivity.this, "android");
再
webView.addJavascriptInterface(jsObject, "android");
那么只有后面的生效,前面的被覆蓋。
但是我們要增加多個空間的話
webView.addJavascriptInterface(MainActivity.this, "android");
webView.addJavascriptInterface(MainActivity.this, "java");
這樣是可行的,倆個均有效果。