在Android中可能因为业务场景需要,JS需要调用Native业务逻辑代码,Native需要通知JS,也即需要实现JS和Native之间通信;

##Java通知JS方式:

WebView.load("javascrpt:method("+param+");");

##JS通知Java有如下几种方式

1、addJavascriptInterface

具体使用示例参见官网描述

但该方案存在版本兼容问题,在4.2版本以下系统上存在安全漏洞,JS能够根据反射能访问注入的对象公有域。当WebView包含恶意代码时,攻击者可以以意想不到的方式来控制宿主App,使用这种方式需要特别小心。一般不建议使用此种方式

参见Here

不能翻墙的可以看看这个

2、onJsPrompt

我们可以通过onJsPrompt这种方式来实现JS和Native之间交互。
每当JS调用prompt方法时Native的WebView所绑定的WebChromeClient的onJsPrompt方法会被触发

我们看看官方的说明

大意是告诉Client去显示一个提示框。如果返回true,WebView就会认为Client将要处理dialog并调用JsPromptResult合适方法(confirm/cancel)通知WebView;如果返回false,默认值将被返回给JS;方法默认返回false。

JS在调用prompt(message, defaultValue)方法时会传递2个参数给Native,分别对应onJSPrompt的第二、三个参数
我们只要和JS那边达成一套协议

myschem://className/methodName?data={param:xxx,callback:xxx}

className: JS调用Native的全路径名
methodName: JS调用Native具体方法
param: Native类方法名的入参
callback: Native调用JS的方法

Native从onJsPrompt方法接受到的message参数符合上面格式后,就可以知道调用Native哪个类哪个方法并且可以将Native产生的数据通过callback方式通知给JS,这是目前Native和JS之间交互的主流的通信方式。
示例代码:

@Overridepublic boolean onJsPrompt(final WebView view, String url, final String message,String defaultValue, final JsPromptResult result) {//parse messageboolean isLegal = isLegal(message);if (isLegal) {//invoke Native method//notice js resultWebView.load("javascrpt:${callback}("+${param}+");");result.confirm("lightweight data");} else {result.confirm();}return true;}

注意事项

  • 返回值必须true,如果返回false,WebView会弹一个很丑的对话框,阻塞用户体验
  • 在返回前必须调用confirm方法
  • 传递给confirm的值必须是轻量级的数据
  • onJsPrompt方法运行在WebView创建的线程中(一般是UI线程)
  • onJsPrompt的操作不要过重
  • 在Activity销毁时避免JS的调用

##3、H5白屏的问题解决方式

  • 如果JS和Native交互使用到onJsprompt方式请确保遵循上面注意事项
  • 因为JavaScript是单线程,如果上面方式还是解决不了白屏问题,请让H5同学使其JS调用放到后台线程

Android-JSNative交互的几种可行性方案H5白屏问题解决方式相关推荐

  1. Android 添加微信分享三种实现方案

    Android 添加微信分享三种方案 使用android的intent实现应用程序之间的通信,将信息通过intent传递给微信.这种方式的局限性在于 a.只能发送图片,而不是文字或者图片+文字. b. ...

  2. Android之解决APP奔溃重启导致Fragment白屏问题

    1.问题 问题APP奔溃重启导致依附的Fragment白屏问题 2.分析 app奔溃重启Activity肯定更新了,但是依附在Activity里面的fragment有缓存,用的是以前的activity ...

  3. Android兼容之打开摄像头后部分手机存在白屏

    App内摄像头存在白屏 部分手机在App内打开摄像头有白屏的情况,一小段时间后恢复正常的情况: 排查方案: 查看摄像头是否多次开启预览 camera.setPreviewDisplay(holder) ...

  4. android圆形图片的一种优化方案(可以显示网络图片),圆形图案显示平滑的优化处理方法、系统及智能设备专利_专利查询 - 天眼查...

    1. 一种圆形图案显示平滑的优化处理方法,其特征在于,包括: A. 获取待优化圆形图案上的圆心坐标,根据所述圆心坐标及圆形图案的半径,得到图 形图案上全部点的坐标值,同时还获取全部点的透明度和RGB参 ...

  5. android半透明闪退,(Android)react-native-splash-screen实践-解决react-native打包好后启动白屏的问题...

    1.安装 npm i react-native-splash-screen --save or yarn add react-native-splash-screen --save 2.自动配置 re ...

  6. mac 新版android studio 找不到DDMS及monitor打开白屏或报错问题

    导致原因: 1.Jdk版本不一致 2.本地存在两个jdk虽然在控制台看到是 jdk1.8.0_144但是默认的还是存在的高版本 解决方案:换 jdk1.8.0_144 就可以了,具体操作看下面日志. ...

  7. Android Studio开发Flutter无法连接夜神模拟器及运行后白屏问题解决

    之前都在真机上测试,今天突然想来模拟器上运行测试看下效果,结果连接不上,下面总结下处理方法 一.连接不上问题 先查明下问题 1.打开cmd,输入adb version 这里可以看到版本号是1.0.40 ...

  8. android 4.4 webview加载部分https网页白屏

    private void initWebview(){//mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//mWebView.setLay ...

  9. 90%的人都浪费了阳台?这6种装修方案建议照搬~

    阳台除了放置洗衣机,晾晒衣服,种种花草,还可以怎样设计呢?今天东易全屋整装的小易易,给大家分享阳台改造的6种可行性方案.如果你家阳台还在堆杂物或者只晒衣服,就赶紧行动利用起来. 方案一: 洗衣机柜 防 ...

最新文章

  1. Python中相见恨晚的技巧(记得收藏)
  2. Mini音乐播放器【简单版】(附源码)
  3. 【KVM系列05】Libvirt 介绍
  4. Python基础教程:带参装饰器、生成器、迭代器、for循环迭代器、枚举
  5. webpack+vue+mui学习心得
  6. IntelliJ IDEA2017 修改缓存文件的路径
  7. ural 1129 (求数据)
  8. oracle19c的版本号_Windows10安装Oracle19c数据库详细记录(图文详解)
  9. 三维旋转四元数系列(0.复数基本介绍)
  10. Bootstrap (remote)事件监听多次
  11. python快捷键失灵
  12. 云南省A级旅游景区名录(截止2016年12月)
  13. 数据挖掘实战系列 之 Kaggle 练习项目快速入门
  14. Android性能优化的问题
  15. 好的中层管理者要兼顾公司和员工的利益
  16. Spring MVC controller控制器映射无法访问问题!!!
  17. java发邮件(简单)
  18. EasyExcel v2.1.6单元格样式设置
  19. 购买了虚拟主机还要云服务器,购买了虚拟主机还要云服务器
  20. 关于jQuery中的SuperSlide插件的使用

热门文章

  1. 七十三、Vue项目城市详细页的动态路由,Banner布局和公用图片画廊组件拆分
  2. 三十三、深入Vue.js语法(上篇)
  3. 变分贝叶斯深度学习综述
  4. 直播 | WWW 2021论文解读:生成式板块推荐的变分控制和评估
  5. ICML 2020 | Google提出最强生成式摘要预训练模型——天马
  6. 2017年度最值得读的AI论文评选 | 大张旗鼓送福利
  7. 创客更新装备 动态规划
  8. ZOJ3785 What day is that day? 快速幂+找规律
  9. MySQL【问题记录 01】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
  10. 服务器文件协议,文件服务器协议