Android与JS 互调几种方式:
一. JS 调用Android
1. 方法1
webview.setWebViewClient(new X5WebViewClient()) 自界说WebViewClient,重写shouldOverrideUrlLoading方法,判定Url实现
- 关键代码 Android注册: public class X5WebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { if (url.contains("js-call:")) { if (url.contains("playLogd")) { Log.d("X5WebViewMyself", "Js调用android方法shouldOverrideUrlLoading"); } return true; } webView.loadUrl(url); // 不加载自带欣赏器 return true; } } JS调用: function JSCallAndroid1(param){ //写一个方法 var url="js-call://"+param; document.location = url; }
1. 方法2
webview.addJavascriptInterface(new JavaFuckJSInterface(this),"APP") 自界说JavaFuckJSInterface类, 通过@JavascriptInterface注解实现
- 关键代码 Android注册: public class JavaFuckJSInterface{ private WeakReference<X5WebActivity> x5WebViewActivity; public JavaFuckJSInterface(X5WebActivity context) { x5WebViewActivity = new WeakReference<>(context); } //通过这个@JavascriptInterface转化成绑定的“App”对象下的同名函数,js代码可以直接调用 @JavascriptInterface// JS 让 Java 吐司 public void jsCallAndroidFun(String data) { x5WebViewActivity.get().toastShow(data); } } JS调用: function JSCallAndroid2(param){ //写一个方法 window.APP.jsCallAndroidFun('JS调用Android方法2-乐成了!!') }
3. 分析哪个方法比力好
第二种方法比力好
二. Android 调用 JS
留意:Android调用Vue中方法,使其弹框alert,必要关键代码:
webview.setWebChromeClient(new WebChromeClient());webview.getSettings().setJavaScriptEnabled(true);1. 方法1
webView.loadUrl();同步方法,没有返回参数。
界说字符串实现 String methondStr = "javascript:showJavaCallJsToast()";//不传参
- 关键代码 Android调用: String methondStr = "javascript:showJavaCallJsToast()";//不传参 // String methondStr = "javascript:showJavaCallJsToast('"+ msg+"')";//传参 webView.loadUrl(methondStr); JS注册: function showJavaCallJsToast(msg){ //写一个方法 alert(msg) }
1. 方法2
webView.evaluateJavascript,异步方法,有返回参数
留意:Android调用Vue中方法,总是失败,是由于该方法没有注册到window上,加上下面代码
mounted () { window.showJavaCallJsToastAsync = this.showJavaCallJsToastAsync window.showJavaCallJsToast = this.showJavaCallJsToast},
- 关键代码 Android调用: // String methondStr = "javascript:showJavaCallJsToastAsync()";//不传参 String methondStr = "javascript:showJavaCallJsToastAsync('"+ msg+"')"; webView.evaluateJavascript(methondStr, new ValueCallback<String>() { // 方式二 @Override public void onReceiveValue(String result) { Log.d("X5WebViewMyself","-----------------JavaCallJsToastAsync---------"+result); } }); JS注册: function showJavaCallJsToastAsync(msg){ //写一个方法 alert(msg) return msg }
3. 分析哪个方法比力好
第二种方法比力好
三. Android 和 JS项目demo代码
关键信息
- api 'com.yanzhenjie:permission:2.0.3' 权限管理
- api 'com.tencent.tbs:tbssdk:44181' 腾讯X5WebView
- BaseApplication 类设置腾讯x5内核主动下载
- 移动端腾讯X5内核手动下载
x5Webview.loadUrl("http://debugtbs.qq.com")
- 移动端腾讯X5内核版本查抄x5Webview.loadUrl("http://soft.imtt.qq.com/browser/tes/feedback.html")
- android内调用当地assets中index.html
x5Webview..loadUrl("file:///android_asset/index.html");
Demo下载
Android和JS项目Demo下载 |