JavaScript調(diào)用Android接口常見(jiàn)的3種方式
前言
在 Android 開(kāi)發(fā)中,JavaScript(JS)調(diào)用原生 Android 接口主要通過(guò) WebView 組件實(shí)現(xiàn)。以下是常見(jiàn)的 3 種核心方式及具體實(shí)現(xiàn)邏輯:
1. addJavascriptInterface 注入接口??
??原理??:通過(guò) WebView 向 JS 暴露一個(gè) Java 對(duì)象,JS 可直接調(diào)用該對(duì)象中被 @JavascriptInterface 注解標(biāo)記的方法
??步驟??:
- ??定義接口類(lèi)??:
public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void showToast(String msg) { Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); } } - ??注入接口到 WebView??:
webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new WebAppInterface(this), "AndroidBridge");
- ??JS 調(diào)用??:
window.AndroidBridge.showToast("Hello from JS!");
??注意事項(xiàng)??:
- ??安全風(fēng)險(xiǎn)??:若未使用
@JavascriptInterface注解,可能導(dǎo)致任意方法被調(diào)用(如系統(tǒng)敏感 API) - ??API 版本??:需最低支持 API 17(Android 4.2)
??2. 攔截 WebChromeClient 對(duì)話框??
??原理??:通過(guò)重寫(xiě) WebChromeClient 的對(duì)話框回調(diào)方法(如 onJsPrompt),解析 JS 發(fā)送的指令
??步驟??:
- ??自定義 WebChromeClient??:
webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { if (message.startsWith("native:")) { // 協(xié)議約定 handleNativeCall(message); // 解析并執(zhí)行原生邏輯 result.confirm("success"); // 返回結(jié)果給 JS return true; } return super.onJsPrompt(view, url, message, defaultValue, result); } }); - ??JS 調(diào)用??:
prompt("native:showToast", "{'msg':'Hello'}"); // 通過(guò) prompt 發(fā)送指令
??適用場(chǎng)景??:
- 需要雙向通信(JS 可獲取原生返回值);
- 兼容低版本 Android(無(wú)需依賴
@JavascriptInterface)
??3. 攔截 URL Scheme??
??原理??:JS 觸發(fā)特定格式的 URL 請(qǐng)求(如 myapp://action?params),Android 通過(guò) shouldOverrideUrlLoading 攔截并處理
??步驟??:
- ??自定義 WebViewClient??:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("myapp://")) { // 協(xié)議約定 parseUrl(url); // 解析 URL 并執(zhí)行對(duì)應(yīng)邏輯 return true; // 阻止默認(rèn)加載 } return super.shouldOverrideUrlLoading(view, url); } }); - ??JS 調(diào)用??:
window.location.href = "myapp://showToast?msg=Hello"; // 或通過(guò) iframe 觸發(fā)
??優(yōu)缺點(diǎn)??:
- ??優(yōu)點(diǎn)??:兼容性最好(支持所有 Android 版本);
- ??缺點(diǎn)??:僅支持單向調(diào)用(JS 無(wú)法直接獲取原生返回值)
??安全建議??
- ??輸入校驗(yàn)??:對(duì) JS 傳遞的參數(shù)進(jìn)行嚴(yán)格校驗(yàn),防止注入攻擊
- ??最小權(quán)限原則??:僅暴露必要的接口方法,避免敏感操作(如文件讀寫(xiě))
- ??HTTPS 加密??:加載遠(yuǎn)程頁(yè)面時(shí)使用 HTTPS,避免中間人攻擊
總結(jié)
到此這篇關(guān)于JavaScript調(diào)用Android接口常見(jiàn)的3種方式的文章就介紹到這了,更多相關(guān)JS調(diào)用Android接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)透明動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)透明動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Android系列---JSON數(shù)據(jù)解析的實(shí)例
JSON(JavaScript Object Notation)和XML,并稱(chēng)為客戶端和服務(wù)端交互解決方案的倚天劍和屠龍刀,這篇文章主要介紹了Android系列---JSON數(shù)據(jù)解析的實(shí)例,有興趣的可以了解一下。2016-11-11
Android判斷當(dāng)前應(yīng)用程序處于前臺(tái)還是后臺(tái)的兩種方法
Android自定義Animation實(shí)現(xiàn)View搖擺效果
解決Android MediaRecorder錄制視頻過(guò)短問(wèn)題

