最近在做项目中,要使用HightChart来实现心电图,于是,使用WebView加载本地html页面,但是数据是通过蓝牙设备采集的数据,用Java代码获取的数据,需要将数据传到JavaScript中去,使用来绘制心电图。以前都加载服务器端返回的url地址,使用WebView加载,这次不同了,要自己实现心电图的绘制。于是细细的学习了JavaScript与Java代码相互传值,最后总结在这里。
为了让WebView中的JavaScript脚本调用Android方法,WebView提供了一套WebSettings工具类,该工具了提供了大量的方法来管理WebView的选项设置,其中setJavaScriptEnable(true),是让WebView中的JavaScript脚本来调用Android方法。
还有一个最重要的方法addJavaScriptInterface(Object obj,String name)方法,该方法负责把object对象暴漏成JavaScript中的name对象。
1.在WebView调用Android只需要三步
- 调用WebView关联的WebSettings中setJavaScriptEnable(true)方法。
- 调用WebView关联的WebSettings中addJavaScriptInterface(Object obj,String name)。
- 在JavaScript中通过暴露出来的name调用Android中的方法。
1.1首先创建一个Java类
|
|
1.2创建在Activity中加载HTML页面
|
|
1.3创建xd.hmtl文件
|
|
注意:
|
|
以上第一个方法就是获取心电数据,第二个方法就是获取测量时间。
2.在Android调用JavaScript方法
2.1webView调用js的基本格式为
|
|
2.2调用js无参无返回值函数
|
|
2.3调用js有参无返回值函数
注意对于字符串作为参数值需要进行转义双引号。
|
|
2.4调用js有参数有返回值的函数
Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。
2.4.1.Java调用js代码
|
|
2.4.2 js函数处理,并将结果通过调用java方法返回
|
|
2.4.3.Java在回调方法中获取js函数返回值
|
|
2.5 java代码时用evaluateJavascript方法调用
|
|
|
|
输出结果
I/MainActivity( 1432): onReceiveValue value=1
注意
上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
总结,JavaScript与Android方法相互传值,基本上就这么多了。