WebView與JS交互代碼沒有被調(diào)用問題
今天遇到一個需求,就是客戶端調(diào)用webview,客戶端點(diǎn)擊的時候服務(wù)端判斷有沒有登錄,登錄就可以進(jìn)行點(diǎn)贊躺翻、評論啥的,沒有登錄就調(diào)出Android原生的登錄界面秋柄。
-
html中通過js調(diào)用java代碼
js中調(diào)用java代碼其實(shí)就記住一點(diǎn)获枝,webview設(shè)置一個和js交互的接口(注意這里只是一般的意思,并不是java中接口的含義)骇笔,這個接口其實(shí)是一個一般的類,同時為這個接口取一個別名。這個過程如下:
webView.addJavascriptInterface(new AndroidJSI(), “AndroidJSI”);
new AndroidJSI()就是這個接口笨触,AndroidJSI就是這個接口的別名懦傍。上面的代碼執(zhí)行之后在html的js中就能通過別名(這里是 “AndroidJSI”)來調(diào)用new AndroidJSI()類中的任何方法。
開始的時候我是這么寫的芦劣,發(fā)現(xiàn)沒有登錄的時候粗俱,點(diǎn)擊webview上的按鈕,并沒有調(diào)出登錄界面虚吟,如下:
private final class AndroidJSI {
public void login() {
if (!DataManager.isLogined()) {
IntentUtil.gotoActivity(getContext(), LoginActivity.class);
}
}
}
查找資料發(fā)現(xiàn):但是因?yàn)榘踩珕栴}寸认,在Android4.2中(如果應(yīng)用的android:targetSdkVersion數(shù)值為17+)JS只能訪問帶有 @JavascriptInterface注解的Java函數(shù)。因此如果你的開發(fā)版本比較高串慰,需要在被調(diào)用的函數(shù)前加上@JavascriptInterface注解偏塞,如下:
private final class AndroidJSI {
@JavascriptInterface
public void login() {
if (!DataManager.isLogined()) {
IntentUtil.gotoActivity(getContext(), LoginActivity.class);
}
}
}