WebView中Java与JavaScript的交互

WebView中Java与JavaScript的交互,第1张

概述原文首发于微信公众号:jzman blog,欢迎关注交流! Android 开发过程中 WebView 的使用比较广泛,常用来加载网页,比如使用 WebView 加载新闻页面、使用 WebView 打

原文首发于微信公众号:jzman-blog,欢迎关注交流!

AndroID 开发过程中 WebVIEw 的使用比较广泛,常用来加载网页,比如使用 WebVIEw 加载新闻页面、使用 WebVIEw 打开本应用的链接以及用 WebVIEw 显示支付信息页面等,那么如何 AndroID 开发中如何与 WebVIEw 中的内容进行交互呢,这种交互主要就是 Java 与 JavaScript 之间的互相调用。下面实现一下如何响应 WebVIEw 中图片的点击事件:

关键方法具体实现显示效果关键方法1. setJavaScriptEnabled()

设置 WebVIEw 是否支持 JavaScript 脚本,默认不支持。

@H_301_20@public abstract voID setJavaScriptEnabled(boolean flag);2. addJavaScriptInterface()

注入 Java 对象到 WebVIEw 中,该对象将会被注入到 JavaScript 主框架的上下文中,允许使用映射的 Java 对象的名称从 JavaScript 访问该对象的方法,且只可以访问添加 @JavaScriptInterface 注解的公共方法才可以从 JavaScript 中访问,可在 API level 17 以上使用这样使用。

如果 API level 16 以及更早的 API,所有的公共方法(包括继承的)都可以从 JavaScript 访问,可能会出现页面重新加载前,Java 对象还未注入到 JavaScript 中的情况,导致调用 Java 方法无效果。

重要声明:该方法允许 JavaScript 控制应用程序,功能非常强大,但是如果 API level 16及更早的 API 版本将会存在一定的风险,比较安全的做法是该方法尽量在 AndroID 4.2 及以上版本使用该方法,如果是更低的版本 JavaScript 可以使用反射来访问所注入对象的公共字段,在 WebVIEw 中使用该方法可能会有不受信任的内容被攻击者利用,让应用程序去执行 Java 代码,要注意线程安全,Java 对象的字段不可访问,AndroID 5.0 以上,所注入的 Java 对象的方法是有一定数量限制的。

@H_301_20@public voID addJavaScriptInterface(Object object,String name) {}具体实现

大致思路就是让 WebVIEw 中的图片响应点击事件,然后调用 AndroID 界面来显示被点击的图片,实现步骤如下:

WebVIEw 设置支持 JavaScript 脚本;创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法;加载 WebVIEw 中要显示的内容;使用 addJavaScriptInterface 方法将 Java 对象映射到 JavaScript 中;在 JavaScript 中调用映射对象的方法,打开显示图片的 Activity;调用 JavaScript 中的方法。第一步:

WebVIEw 设置支持 JavaScript 脚本,如下:

@H_301_20@//设置支持JavaScriptwebSettings.setJavaScriptEnabled(true);第二步:

创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法,如下:

@H_301_20@/** * 与 JavaScript 通信的 Java 对象,提供 JavaScript 调用的方法 * Created by jzman on 2017/7/20 0020. */public class AndroIDInterface { private Context context; public AndroIDInterface(Context context) { this.context = context; } /** * 添加注解 @JavaScriptInterface * JavaScript 要调用的方法 */ @JavaScriptInterface public voID showImage(String imgurl){ Intent intent = new Intent(); intent.putExtra("img",imgurl); intent.setClass(context,ImageActivity.class); context.startActivity(intent); }}第三步:

加载 WebVIEw 要显示的内容,这里加载 aasets 目录下的 HTML 文件,如下:

@H_301_20@//加载 assets 目录下的 HTML 文件webVIEw.loadUrl("file:///androID_asset/index.HTML");第四步:

使用 addJavaScriptInterface 方法将 Java 对象映射到 JavaScript 中,如下:

@H_301_20@//注入Java对象并映射到JavaScript中//参数(与javescript通信的对象,映射到JavaScript中的对象)webVIEw.addJavaScriptInterface(new AndroIDInterface(this),"imageListener");第五步:

在 JavaScript 中查找 标签并在其点击事件里面调用其映射对象的方法打开显示图片的 Activity,如下:

@H_301_20@<script type="text/JavaScript"> function findimg(){ //查找img标签 var imgs = document.getElementsByTagname("img"); //遍历img标签 for(var i=0; i<imgs.length; i++){ //为每一个标签设置点击事件 imgs[i].onclick = function(){ //imageListener映射的Java对象 window.imageListener.showImage(this.src); } } }</script>第六步:

调用 JavaScript 里面的方法,为保证调用时 Java 对象还未注入到 JavaScript 中,应该页面加载完成时调用 JavaScript 的方法,如下:

@H_301_20@//设置 WebVIEwClIEnt 监听相关事件webVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt(){ //页面加载完成回调该方法 @OverrIDe public voID onPageFinished(WebVIEw vIEw,String url) { super.onPageFinished(vIEw,url); //保证页面加载完成后Java对象注入到JavaScript中 webVIEw.loadUrl("JavaScript:findimg()"); }});显示效果

源码请参考:github

可以关注公众号:jzman-blog,一起交流学习。

总结

以上是内存溢出为你收集整理的WebView中Java与JavaScript的交互全部内容,希望文章能够帮你解决WebView中Java与JavaScript的交互所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1121238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存