乐趣区

Android 与 JavaScript 交互 支持的数据类型

在 Android 混合开发中,WebView 是中间件, 承担着渲染网页的职责。
WebView 的使用教程参见官网和 Carson_Ho 的这篇博客。
当需要 Android 原生与 H5 之间交互的时候,需要调用 WebView 的 getSettings().setJavaScriptEnabled(true); 以及 webView.addJavascriptInterface(Js 对象名,Java 对象);
前者允许 Android 原生与 H5 之间的交互,后者将 Java 对象映射为 JavaScript 的对象。
假设被映射为 JavaScript 对象的 Java 对象长的像这样:
/*
* 作为 addJavascriptInterface() 方法的第二个参数,该类将被映射为 JavaScript 对象
*/
public class MyJavaScriptObject{

public void toastShort(){
Toast.maskText(context,” 吐个司 ”,Toast.LENGTH_SHORT).show();
}

@JavascriptInterface
public void toastLong(){
Toast.maskText(context,” 吐个司 ”,Toast.LENGTH_LONG).show();
}

@JavascriptInterface
public void question1(ClassA param){
//use param
}

@JavascriptInterface
public ClassB question2(){
//return object of ClassB
return new ClassB();
}
}
则:

toastShort() 方法在 JavaScript 中不可用,因为该方法没有被 @JavascriptInterface 注解标记;
ClassA 只能是 Java 的内置类型或 String,否则 param 为 null、或为 undefined(当用 String 接收时);
ClassB 只能是 Java 的内置类型或 String,否则 JavaScript 接收的是 {};

也就是说:

JS 调用 Android 原生方法,参数须是 Java 的内置类型:int、String 等,若是 JavaScript 对象,需字符串化,否则 Android 无法正确接收;
JS 调用 Android 原生方法,返回值是内置类型:int、String 等,JS 能够正确接收。若是 Java 自定义类型,则 JS 接收不到正确数据;
JS 可以通过 Android 原生方法的返回值获取内置类型的参数,如 String
若需要互传复杂类型的对象,双方须以 String 对媒介,以各自语言的 Json 工具类进行相互转化;

参见:https://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android

退出移动版