Android WebView開發(fā)之WebView與Native交互
前言
附GitHub源碼:WebViewExplore
一、JS調(diào)用Native的三種方式
1、通過WebView的addJavascriptInterface進(jìn)行對(duì)象映射
需要注意的是這種調(diào)用方式,如果你的 minSdkVersion <=16那么需要考慮到4.2之前的漏洞問題。
mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
/**
* JS調(diào)用android原生方法1:
*
* 通過WebView的addJavascriptInterface()進(jìn)行對(duì)象映射
*/
private class JsCallAndroidInterface {
/**
*@JavascriptInterface注解方法.
* js端調(diào)用,4.2以后安全;4.2以前,當(dāng)JS拿到Android這個(gè)對(duì)象后,
* 就可以調(diào)用這個(gè)Android對(duì)象中所有的方法,包括系統(tǒng)類(java.lang.Runtime 類)
* 從而進(jìn)行任意代碼執(zhí)行。
* @param msg
*/
@JavascriptInterface
public void callback(String msg) {
ToastUtil.showToast(APIWebViewActivity.this, "JS方法回調(diào)到web了 :" + msg);
}
}
2、通過WebViewClient shouldOverrideUrlLoading方法回調(diào)攔截url:
與url重定向類似,可在此做url的攔截,已達(dá)到針對(duì)性的調(diào)用native方法的目的。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (resolveShouldLoadLogic(url)) {
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
/**
* JS調(diào)用android原生方法2:
*
* 通過WebViewClient shouldOverrideUrlLoading方法回調(diào)攔截url
*
* 根據(jù)協(xié)議的參數(shù),判斷是否是所需要的url:
* 一般根據(jù)scheme(協(xié)議格式),authority(協(xié)議名)來判讀
*
* @param url
* @return
*/
private boolean resolveShouldLoadLogic(String url) {
Uri uri = Uri.parse(url);
if (uri.getScheme().equals("js")) {
if (uri.getAuthority().equals("Authority")) {
ToastUtil.showToast(APIWebViewActivity.this, "方法2");
}
return true;
}
return false;
}
3、通過WebChromeClient的 onJsPrompt()等方法 ,回調(diào)攔截JS對(duì)話框prompt()等:
/**
* 是否支持頁面中的js輸入彈出框
*
* @param view
* @param url
* @param message
* @param defaultValue
* @param result
* @return
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
JsPromptResult result) {
if (resolveJSPrompt(message)) {
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
/**
* JS調(diào)用android原生方法3:
*
* 通過WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法
* 回調(diào)攔截JS對(duì)話框alert() confirm() prompt()
*/
private boolean resolveJSPrompt(String message) {
Uri uri = Uri.parse(message);
if (uri.getScheme().equals("js")) {
if (uri.getAuthority().equals("Authority")) {
ToastUtil.showToast(APIWebViewActivity.this, "方法3");
}
return true;
}
return false;
}
完整源碼
Js調(diào)用Native示例源碼-JsToNativeBridgeActivity
二、Native調(diào)用WebView的兩種方案
1、loadUrl("javascript:callJS()"):
此方法簡潔、效率低。當(dāng)不需要返回值且對(duì)性能要求較低時(shí)可以考慮使用:
/**
* Native調(diào)用JS方法一:
* 方法簡潔、效率低
* 當(dāng)不需要獲取返回值且對(duì)性能要求較低時(shí)可選擇使用。
*/
webView.loadUrl("javascript:callJS()");
2、evaluateJavascript(script,resultCallback):
需4.4以上才可使用,效率高且有返回值:
/**
* Native調(diào)用JS方法二:
* 效率高,有返回值(4.4以上系統(tǒng)使用)
*/
webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此處為JS返回的結(jié)果
Logger.d("value:" + value);
}
});
完整源碼
Native調(diào)用JS示例源碼-NativeToJsBridgeActivity?
到此這篇關(guān)于Android WebView開發(fā)之WebView與Native交互的文章就介紹到這了,更多相關(guān)Android WebView與Native交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ExpandableListView實(shí)現(xiàn)手風(fēng)琴效果
這篇文章主要為大家詳細(xì)介紹了ExpandableListView實(shí)現(xiàn)手風(fēng)琴效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android下拉刷新框架實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Android下拉刷新框架實(shí)現(xiàn)代碼實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
Android Flutter實(shí)現(xiàn)仿閑魚動(dòng)畫效果
目前正在做的項(xiàng)目,為了增加用戶的體驗(yàn)度,準(zhǔn)備增加一些動(dòng)畫效果。本文將通過Android Flutter實(shí)現(xiàn)仿閑魚動(dòng)畫效果,感興趣的可以嘗試一下2023-02-02
Android實(shí)現(xiàn)音樂播放器歌詞顯示效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)音樂播放器歌詞顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
android判斷一個(gè)Activity是否處于棧頂?shù)膶?shí)例
下面小編就為大家分享一篇android判斷一個(gè)Activity是否處于棧頂?shù)膶?shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Android實(shí)戰(zhàn)打飛機(jī)游戲之怪物(敵機(jī))類的實(shí)現(xiàn)(4)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)打飛機(jī)游戲之怪物(敵機(jī))類的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Flutter利用ORM框架簡化本地?cái)?shù)據(jù)庫管理詳解
使用?sqflite?相對(duì)來說還是有點(diǎn)復(fù)雜,比如遇到數(shù)據(jù)不兼容的時(shí)候需要手動(dòng)轉(zhuǎn)換,增加了不少繁瑣的代碼。本篇我們就來介紹一個(gè)?ORM?框架,來簡化數(shù)據(jù)庫的管理,感興趣的可以了解一下2023-04-04

