问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

webview判断 js是否有 交互对象

发布网友 发布时间:2022-04-22 06:31

我来回答

1个回答

热心网友 时间:2022-04-23 03:00

  android与js交互有两种方式,第一种是通过系统提供的@JavascriptInterface注解实现,第二种就是js注入。下面来详细讲解一下二者的使用方式,原理,区别。
  一、@JavascriptInterface实现
  实现步骤:
  a.设置WebView支持js脚本
  b.为提供给js调用的方法加上@JavascriptInterface注解c.给WebView添加js接口
  [java] view plain copy
  webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new JSMethod(mContext), "lh");public class JSMethod {
  private Context mContext;
  public JSMethod(Context mContext) {
  this.mContext = mContext;
  }
  @JavascriptInterface
  public void toast(String msg) {
  Toast.makeText(mContext, msg == null ? "" : msg, Toast.LENGTH_SHORT).show();}
  }
  js端调用android方法:
  [javascript] view plain copy
  lh.toast("Hello,China!");
  android端执行js方法:
  [java] view plain copy
  webView.loadUrl("javascript:console(" + "'Hello,China!'" + ")"");二、js注入实现
  先来说说原理吧,当js调用prompt()方法时,WebChromeClient.onJsPrompt()方法会被触发,当js触发Android提供的接口方法时,将该方法的方法名称、参数类型、参数值转成json,然后通过prompt方法传递给android端,android端解析json并通过反射执行对应的方法,同时也支持执行匿名回调。
  整个流程比较复杂,看图:
  为WebView绑定WebChormeClient监听,在Html加载进度25%时进行js注入(注入的js是根据android提供给js的对象类名动态生成);动态注入的js代码如下:
  [javascript] view plain copy
  javascript: (function(b) {
  console.log("HostApp initialization begin");var a = {
  queue: [],
  callback: function() {
  var d = Array.prototype.slice.call(arguments, 0);//获取该函数参数并转换为Array数组var c = d.shift();//取得数组第一个元素
  var e = d.shift();
  this.queue[c].apply(this, d);//新建一个对象 属性名称为取得的c,并将d数组作为他的值。然后将这个对象push到queue数组if(!e) {//e为空的时候,将queue数组属性名称为c的对象删除delete this.queue[c]
  }
  }
  };
  //各种赋值,最后都等于同一个函数
  a.alert = a.alert = a.alert = a.delayJsCallBack = a.getIMSI = a.getOsSdk = a.goBack = a.overloadMethod = a.overloadMethod = a.passJson2Java = a.passLongType = a.retBackPassJson = a.retJavaObject = a.testLossTime = a.toast = a.toast = function() {var f = Array.prototype.slice.call(arguments, 0);if(f.length < 1) {
  throw "HostApp call error, message:miss method name"}
  var e = [];
  //此段判断,然后赋值
  for(var h = 1; h < f.length; h++) {
  var c = f[h];
  var j = typeof c;
  e[e.length] = j;
  if(j == "function") {
  var d = a.queue.length;
  a.queue[d] = c;
  f[h] = d
  }
  }
  //将匿名对象{method: f.shift(),types: e,args: f}转换成json字符串并用浏览器弹出确认可输入框,然后取得输入框的值json序列化为js对象var g = JSON.parse(prompt(JSON.stringify({method: f.shift(),
  types: e,
  args: f
  })));
  if(g.code != 200) {
  throw "HostApp call error, code:" + g.code + ", message:" + g.result}
  return g.result
  };
  //获取a的属性值,然后循环
  Object.getOwnPropertyNames(a).forEach(function(d) {var c = a[d];
  //判断赋值
  if(typeof c === "function" && d !== "callback") {a[d] = function() {
  //concat 连接两个数组
  return c.apply(a, [d].concat(Array.prototype.slice.call(arguments, 0)))}
  }
  });
  b.HostApp = a;
  console.log("HostApp initialization end")})(window);//闭包函数默认执行,然后赋给window。这样window.b就可以执行了 b.HostApp就是执行a的内容,但是a具体处理逻辑不对外开放,避免外部污染a内部逻辑代码不难,可以自行理解,其中回调函数被封装在了a对象里面,确保android端可以通过webview.loadUrl()执行回调。
  android端回调js代码如下:
  [javascript] view plain copy
  javascript:HostApp.callback(0, 0 ,"call back haha");android提供的每一个js方法都对应一个JsCallback对象,android就可以通过JsCallback对象来生成并执行回调js的代码。
  三、优缺点
  a.第一种方式不安全,不添加addJavascriptInterface,甚至默认false,在低于API17的WebView上默认添加"SearchBoxJavaBridge_"到mJavaScriptObjects中。这样就有可能通过用户信任的客户端获取SD卡的数据;b.第一种方式必须要API大于等于17才能使用
  c.第一种方式当有js回调函数需要android端执行时,都需要将匿名回调函数赋值给全局函数才能供android端回调,增加了js和android端通信的封装层的低效代码量;而第二种方式则是通过动态注入js的方式则非常方便。
  d.第二种方式也有一定*,比如android提供的方法必须是static修饰的,且方法第一个参数必须为WebView,不过这不影响使用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
以后再也不会买vivo质量太差了!才买来的都是卡死,两千多的手机就... 17寸显示器 部分网页右侧看不到 无法显示 猎豹手机浏览器使用百度搜索为何经常白屏,只要点网址导航页的百度,就很... 用什么浏览器都放不出视频是怎么回事,会出现白屏一闪一闪的,时而又五颜... 在使用猎豹浏览器打开一个新标签时突然白屏,然后恢复正常 食品可否退换货 换了主板后,开机只有CPU风扇在转,进不了系统没有"嘀"声显示器没反应 CP... ...又没有发票怎么办了 我是用微信付款的 我该怎么投诉了 ...话多交多得,但以我爸为例,57 岁,交3年可领养老金 眉山城镇社保按1.0缴费退休多少钱? 怎样做黄颡鱼比较好吃? 黄颡鱼吃法 android js 交互 传值除了数字传不了怎么解决js那... 黄辣丁鱼的做法 黑马培训有android webview js 交互内容吗 清蒸黄骨鱼怎么做 怎样实现android和javaweb数据交互 怎么才能把这个网址弄在手机桌面上? 黄刺鱼怎么熬汤才好吃 Android-webview和js脚本语言交互的时候怎么获取js... 在手机上,怎么把一个网站设置一个快捷方式到手机... 黄刺鱼怎么烧好吃 android js交互为什么进两次方法 怎么把网址放到手机桌面上 黄颡鱼汤怎么做才好吃 如何把某个网站发送到手机桌面,也就是添加到桌面... 黄颡鱼属一种常见的淡水鱼,制作黄颡鱼的时候需要... 安卓开发webview与js交互 手机网页如何设置到手机桌面 黄刺鱼怎么做好吃? 你有哪些做黄颡鱼的秘方? windows共享文件夹怎么使用 android webview js 交互可以调手机照片吗 黄颡鱼到底怎麼做好吃 安卓中js和webview交互必须传值吗 红烧黄刺鱼怎么做好吃 js和android交互为什么有弹窗显示参数 统帅热水器淋浴头怎么换 海尔统帅热水器安装费用价格表给个表 统帅热水器今年六月份安装了一台海尔统帅热水器 安... 买统帅热水器两三天还不给安装可以投诉吗 统帅电热水器没有排圬口怎么更换镁棒? 华为手机管家扫描出的推荐清理中的应用数据能清理吗? 华为手机怎样清理系统应用数据 儿童焦虑症较为常见,儿童焦虑症具体表现有哪些? 儿童焦虑症包括哪几类? 儿童焦虑症较为常见,大部分是哪些因素导致的? 儿童焦虑症怎么办?儿童焦虑症是如何引起的? 家长须知:儿童焦虑症的几大症状表现 儿童焦虑症较为常见,是哪些因素导致的?