Android 与 JS 交互实际上是通过 WebView 互相调用方法:

  • Android 去调用 JS 的代码;
  • JS 去调用 Android 的代码。

一、JS 调用 Android 方法

方法一:通过 WebView 的 addJavascriptInterface() 进行对象映射

优点:使用简单,仅将Android对象和JS对象映射即可

缺点:存在漏洞问题

1)允许 WebView 加载 JS

webView.getSettings().setJavaScriptEnabled(true);

2)编写 JS 接口

public class JsInterface {//一个object对象,里边有方法注解了@JavascriptInterface就行private static final String TAG = "JsInterface";private JsBridge jsBridge;public JsInterface(JsBridge jsBridge) {this.jsBridge = jsBridge;}/*** 这个方法由 JS 调用, 不在主线程执行** @param value*/@JavascriptInterfacepublic void callAndroid(String value) {Log.i(TAG, "value = " + value);jsBridge.setTextValue(value);}
}

3)给 WebView 添加 JS 接口

webView.addJavascriptInterface(new JsInterface(this), "launcher");// 此处的 launcher 可以自定义,最终是 JS 中要使用的对象

4)JS 代码中调用 Java 方法

if (window.launcher){ // 判断 launcher 对象是否存在// 此处的 launcher 要和 第3步中定义的 launcher 保持一致// JS 调用 Android 的方法launcher.callAndroid(str);
}else{alert("launcher not found!");
}

方法二:通过 WebViewClient 的 shouldOverrideUrlLoading() 方法回调拦截 url

优点:不存在方式一的漏洞;

缺点:JS获取Android方法的返回值复杂。

1)JS 代码中,约定协议

function callAndroid(){// 约定的 url 协议为:js://webview?arg1=111&arg2=222document.location = "js://webview?arg1="+inputEle.value+"&arg2=222";
}

2)Android 代码中,通过设置 WebViewClient 对协议进行拦截处理

webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)// 例如:url = "js://webview?arg1=111&arg2=222"Uri uri = Uri.parse(url);// 如果url的协议 = 预先约定的 js 协议if (uri.getScheme().equals("js")) {// 拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("webview")) {// 执行JS所需要调用的逻辑Log.e("TAG", "JS 调用了 Android 的方法");Set<String> collection = uri.getQueryParameterNames();Iterator<String> it = collection.iterator();String result = "";while (it.hasNext()) {result += uri.getQueryParameter(it.next()) + ",";}tv_result.setText(result);}return true;}return super.shouldOverrideUrlLoading(view, url);}
});

方法三:通过 WebChromeClient 的 onJsAlert() 、 onJsConfirm() 、 onJsPrompt()方法回调拦截 JS 对话框 alert() 、 confirm() 、 prompt() 消息

处理方式和方法二差不多

1)JS代码中,约定协议

// 调用 prompt()
var result=prompt("js://prompt?arg1="+inputEle.value+"&arg2=222");
alert("prompt:" + result);

2)Android 代码中,通过设置 WebChromeClient 对协议进行拦截处理

webView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)// 例如:url = "js://webview?arg1=111&arg2=222"Uri uri = Uri.parse(message);Log.e("TAG", "----onJsPrompt--->>" + url + "," + message);// 如果url的协议 = 预先约定的 js 协议if (uri.getScheme().equals("js")) {// 拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("prompt")) {// 执行JS所需要调用的逻辑Log.e("TAG", "JS 调用了 Android 的方法");Set<String> collection = uri.getQueryParameterNames();Iterator<String> it = collection.iterator();String result2 = "";while (it.hasNext()) {result2 += uri.getQueryParameter(it.next()) + ",";}tv_result.setText(result2);}return true;}return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {Log.e("TAG", "----onJsAlert--->>" + url+ "," + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {Log.e("TAG", "----onJsConfirm--->>" + url+ "," + message);return super.onJsConfirm(view, url, message, result);}
});

二、 Android 调用 JS 方法

方法一: 通过 WebView 的 loadUrl()

1)编写 JS 方法

var callJS = function(str){inputEle.value = str;
}

2)使用 webView.loadUrl() 调用 JS 方法

// Android 调用 JS 方法
webView.loadUrl("javascript:if(window.callJS){window.callJS('" + str + "');}");

方法二: 通过 WebView 的 evaluateJavascript()

  • 该方法比第一种方法效率更高,使用更简洁;
  • 该方法执行不会刷新页面,而第一种方法( loadUrl )则会;
  • Android 4.4 以后才能使用。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {webView.evaluateJavascript("javascript:if(window.callJS){window.callJS('" + str + "');}", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {Log.e("TAG", "--------->>" + value);}});
}

最后附上源码地址:github.com/iceCola7/Js…

Android 原生和 JS 交互实践相关推荐

  1. android原生和H5交互(转)

    最近在左一个Android原生的H5混合开发的APP,之前还没有好好的总结一下Android原生 和 H5 之间交互的方法,这里来总结一下: 1.hybrid通信,主要就是前端的js和我们Androi ...

  2. android原生和H5交互

    最近在左一个Android原生的H5混合开发的APP,之前还没有好好的总结一下Android原生 和 H5 之间交互的方法,这里来总结一下: 1.hybrid通信,主要就是前端的js和我们Androi ...

  3. Android—WebView与JS交互

    Html文件: WebView与JS交互方式: 1. 前提: WebSettings webSettings = webView.getSettings(); // 设置与Js交互的权限 webSet ...

  4. android 原生调用js,js调用原生

    原生调用js方法,带参数 activityBaseWebAddWebView.loadUrl("javascript:changeColor('" + viewColor + &q ...

  5. Android WebView与JS交互入门

    2019独角兽企业重金招聘Python工程师标准>>> 首先在Anndroid代码中对WebView进行初始化 webView = (WebView) findViewById(R. ...

  6. android原生代码转h5,Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。...

    当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID:  大概就是点击H5界面跳转到Androi ...

  7. Android WebView 与 JS 交互

    2019独角兽企业重金招聘Python工程师标准>>> 在android activity webView的使用,activity中执行html中的js 方法, 和在html 中 调 ...

  8. Android WebView与js交互通信

    事出有因,那天我看到手厅的客户端里,在网页webview中点击网络设置后,跳转到了手机的网络设置界面,然后就搜了一下,原来是html中js与androidApp之间的交互.这么说的太费劲了,还是上截图 ...

  9. android与js交互

    首先引用一篇文章,看过这篇文章基本上就明白android大致与js是如何交互的了 Android与HTML+JS交互入门 ----------------------------分割线-------- ...

最新文章

  1. SQL中内连接、外连接、交叉连接
  2. 某医院DFT SCSI 300GB *8 RAID5数据恢复成功
  3. Python脚本导出为exe程序
  4. Activiti概述
  5. 查看linux的系统位数
  6. Android4.1 onTouchEvent分析 (选字模式等)
  7. 【DI专题】在 DI 脚本文件中调用存储过程
  8. vl_sift函数用法
  9. bzoj 1295: [SCOI2009]最长距离
  10. 私人笔记 -- 将图片插入到指定的单元格位置,并设置图片的宽度和高度
  11. php集成是什么原因,PHP集成开发环境里面的www问题
  12. python对XML 操作
  13. jQuery Mobile中头部栏header的data-*选项
  14. Gogs代码托管系统安装配置手册
  15. Proof of Stake FAQ
  16. html5_滑条等其他标签
  17. linux怎么随机生成数字,详解Linux如何生成随机数字和字符串
  18. 语音信号处理 | Python实现端点检测
  19. ie8上传图片获取文件大小
  20. 微信小程序复制文本方法

热门文章

  1. matlab摄像头实时人脸检测,一个关于摄像头实时人脸检测的程序
  2. app维持h5登录状态_维持团队设计质量的5种工具
  3. 使用TIM捕获测量PWM频率和占空比
  4. Elasticsearch:创建一个 Elasticsearch Ingest 插件
  5. 30、T5L 迪文屏 C51开发之 ADC模数转换
  6. openlayers 实现风场效果图
  7. MPI 矩阵乘法 并行优化
  8. 【PMAC学习笔记——第0篇】初识PMAC运动控制卡以及 Microsoft Visual C++ 2019,PeWin32 PRO2环境搭建
  9. 12.28-Win7e系统定制
  10. InfluxDB 2.0 原理与应用实践