網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
附GitHub源碼:WebViewExplore
一、JS調(diào)用Native的三種方式
1、通過(guò)WebView的addJavascriptInterface進(jìn)行對(duì)象映射
需要注意的是這種調(diào)用方式,如果你的 minSdkVersion <=16那么需要考慮到4.2之前的漏洞問(wèn)題。
mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
/** * JS調(diào)用android原生方法1: * * 通過(guò)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、通過(guò)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: * * 通過(guò)WebViewClient shouldOverrideUrlLoading方法回調(diào)攔截url * * 根據(jù)協(xié)議的參數(shù),判斷是否是所需要的url: * 一般根據(jù)scheme(協(xié)議格式),authority(協(xié)議名)來(lái)判讀 * * @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、通過(guò)WebChromeClient的 onJsPrompt()等方法 ,回調(diào)攔截JS對(duì)話框prompt()等:
/** * 是否支持頁(yè)面中的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: * * 通過(guò)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()"):
此方法簡(jiǎn)潔、效率低。當(dāng)不需要返回值且對(duì)性能要求較低時(shí)可以考慮使用:
/** * Native調(diào)用JS方法一: * 方法簡(jiǎn)潔、效率低 * 當(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?
原文鏈接:https://blog.csdn.net/u012440207/article/details/121764843
相關(guān)推薦
- 2022-10-16 C++的array和&array有什么區(qū)別_C 語(yǔ)言
- 2022-07-13 nginx-1.20*安裝check模塊
- 2022-06-11 python?針對(duì)在子文件夾中的md文檔實(shí)現(xiàn)批量md轉(zhuǎn)word_python
- 2022-07-21 C#?PDF轉(zhuǎn)圖片(JPG,Png)的項(xiàng)目實(shí)踐_C#教程
- 2022-12-03 init?output?stream初始化輸出流源碼分析_Android
- 2022-06-29 詳解Shell腳本中^M的問(wèn)題和解決方案_linux shell
- 2022-04-16 python修改全局變量可以不加global嗎?_python
- 2022-07-12 element表格 頻繁切換維度,導(dǎo)致表頭渲染有誤
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支