热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中native与Html中Js交互

本篇功能主要介绍Android中Native层与Html层的交互前提:mWebView.getSettings().setJavaScriptEnabled(true);设置支持ja

本篇功能主要介绍Android 中 Native层与Html层的交互


前提

mWebView.getSettings().setJavascriptEnabled(true);    // 设置支持Javascript脚本
mWebView.loadUrl("file:///android_asset/test.html"); // 本地assets下面测试页面

1. native层调用 html层中js方法(可携带参数)

1.1 java调用js方法无返回值

     java 通过webview 的loadUrl调用 js方法无法接收返回值,调用如下:      java code:
mWebView.loadUrl("Javascript:CallJsMethod()");     // CalljsMethod() 为js中声明的方法(无参)
mWebView.loadUrl("Javascript:CallJsMethodParams("+"calljsMethod"+")"); // 携参调用js方法

     html code:

function CallJsMethod() {
alert("我是js方法我被javca层调用了= 0 =");
}

function CallJsMethodParams(param) {
alert("我是js方法我被java调用接收参数为【" + param+ "]");
}

1.2 java调用js方法接收其返回值

     现在需求是 通过java层调用js中的方法并接收js方法返回的数据,实现方式有二种,
     方式1: java层调用js方法,在该js方法内携参回调java层指定的方法将参数传递过去      java code:
mWebView.loadUrl("Javascript:javaCallJSRretunStrMethod()");
/**
* js 回调java方法 有参数
*/
@JavascriptInterface
public void CallBackJavaMethodParam(String str){
Toast.makeText(WebViewActivity.this, "java调用js方法的返回数据为【" + str + "】", Toast.LENGTH_SHORT).show();
}
     html code:
function javaCallJSRretunStrMethod() {
window.jscalljava.CallBackJavaMethodParam("JS返回数据");
alert("JS返回数据");
}

     方式2:使用webview.evaluateJavascript()方法异步执行Javascript方法并获取返回值
     java code:
 String script=String.format("Javascript: CallJSRretunStrMethod()");   
mWebView.evaluateJavascript(script, new ValueCallback() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "value=" + value);
}});
     html code:
function CallJSRretunStrMethod() {
return "呵呵呵哒"; }

有没有发现通过java层调用js方法alert却不起作用????
解决办法:设置webview 的 setWebChromeClient
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result)
{
new AlertDialog.Builder(WebViewActivity.this)
.setTitle("dialog")
.setMessage(message)
.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener()
{
public void onClick(DialogInterface dialog, int which){
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
};
});

2.js层调用native层的方法(可携带参数)

    js调用native方法需要设置 addJavascriptInterface (arg1,arg2);   addJavascriptInterface方法有两个参数,第一个参数就是我们一般会实现一个自己的类,类里面提供我们要提供给Javascript访问的方法;第二个参数是访问我们在obj中声明的方法时候所用到的js对象.
mWebView.addJavascriptInterface(new JSCallJava(), "jscalljava");
class JSCallJava {
/**
* js 调用java方法 无参 无返回值
*/
@JavascriptInterface
public void CallJavaMethod() {
Toast.makeText(WebViewActivity.this, "我是java方法我被js调用了",Toast.LENGTH_SHORT).show();
}

/**
* js调用java方法 有参 并且js接收其返回值
*/
@JavascriptInterface
public String CallJavaMethodParam(final String param) {
Toast.makeText(WebViewActivity.this,"我是java方法我被js调用了接受参数为 【" + param + "]", Toast.LENGTH_SHORT).show();
return "我是java层方法我被js调用了接受参数为 【" + param + "]";
}


/**
* js 回调java方法 有参数
*/
@JavascriptInterface
public void CallBackJavaMethodParam(String str){
Toast.makeText(WebViewActivity.this, "java调用js方法的返回数据为【" + str + "】", Toast.LENGTH_SHORT).show();
}
}

@JavascriptInterface之后就必须要考虑混淆时候的问题,如果混淆的时候把@JavascriptInterface搞丢了你的程序就无法调用了。

其实很简单,你只需要在混淆里面加上:
-keepattributes Annotation
-keepattributes JavascriptInterface

然后再混淆就没问题了!

注:因为安全问题,在Android4.2中(如果应用的android:targetSdkVersion数值为17+)JS只能访问带有 @JavascriptInterface注解的Java函数




demo下载









   





推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
gete
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有