Android与JaveScript数据交互使用原理

时间:2021-04-01 23:20:39

Android网页开发中经常涉及到WebView和网页端Javascript的交互,比如网页端调用Android设备实现业务功能(拍照,选择照片等等),Android也可以调用网页端的Javascript接口传递数据等等。
显然,WebView和Javascript的交互分为两种:网页调用Android和Android调用Javascript。
1.网页调用Android。
这个实现是通过Javascript调用Android提供的交互接口来实现的,其实现是比较复杂的。只有Android先提供接口然后注册给网页端,网页端才可以调用Android来实现功能,这需要用到WebView的一个很重要的方法addJavascriptInterface,这个方法的使用可以参照官方文档的解释(http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String))。
方法详细介绍如下:

  • 签名: public void addJavascriptInterface (Object object, String name)
  • 作用: 向WebView中注入指定别名的Java对象,这个对象位于Javascript的上下文环境中。
  • 参数:
    object: 要注入WebView的Java对象
    name: 注入对象的别名。

以下是官方文档中提供的一个示例:
Android与JaveScript数据交互使用原理
以上示例实现效果是:
网页上弹出一个对话框,显示内容是injectedObject。它首先定义了一个JsObject类,类中有一个toString(继承自Object)方法,这个方法返回了一个字符串“injectedObject”,值得注意的是它有一个注解@JavascriptInterface;然后调用了WebView的addJavascriptInterface方法注入了一个别名为“injectedObject”(注意这里与toString的返回值没有任何关系,只是这里凑巧相同而已)的一个JsObject匿名对象,接着让WebView加载了text/html类型的数据,也就是加载一个网页,最后调用了loadUrl方法调用了Javascript的alert方法弹出一个对话框,对话框内容指定为injectedObject.toString(),注意这个参数的含义:调用别名为injectedObject对象的toString方法,也就会返回字符串“injectedObject”,本质上,这里javascript的alert方法中调用了注入的JsObject对象的toString方法。
因此,最重要的是定义好用于交互的接口方法,按照传统,遵循Java的对象思想,我们会把所有的接口方法定义在一个类中,这样既方便管理,也方便注入。接口方法的定义与普通方法的定义没有任何区别,只是加了2个限制条件:a.必须是public方法,b.必须有@JavasInterface注解。接口方法同样可以有返回值和参数,但需要注意的是它的参数只有定义为String类型才有意义,若网页段调用这个方法传递了数值类型的参数,最终也是以String类型传入,若直接使用对应的数值类型接受,会出现无法接受参数的情况,虽然方法被调用了。
此外,还需要注意,这个方法调用其实是运用了远程方法调用机制,运行在另一个非UI线程,所以所有UI的操作都需要同步到UI线程,否则会出现异常退出,程序崩掉。最后考虑一下安全问题,尽量保证这个方法运行在4.2或以上的设备上,否则会存在潜在的安全问题,因为在老版本中,注入的Java对象可能会被透明化,Javascript甚至可以通过反射访问注入对象的属性;而且要保证这个方法运行可信,不要用这个方法加载一下无法可信的内容以防止漏洞。
2.Android调用Javascript
这个是比较简单的,直接使用WebView的loadUrl方法传入调用网页端的Javascript方法,例如下例的调用方法:
webView.loadUrl(“javascript:alert(hello Android)”);
这里就是Android直接调用了javascript的alert方法,弹出一个对话框,其他方法的调用也是类似的,可以在加载的网页界面直接调用。