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