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

from flickr.com

在Android混合开发中,WebView是中间件,承担着渲染网页的职责。javascript

WebView的使用教程参见官网Carson_Ho的这篇博客java

当须要Android原生与H5之间交互的时候,须要调用WebView的getSettings().setJavaScriptEnabled(true);以及webView.addJavascriptInterface(Js对象名,Java对象);android

前者容许Android原生与H5之间的交互,后者将Java对象映射为JavaScript的对象。web

假设被映射为JavaScript对象的Java对象长的像这样:app

/*
* 做为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();
        }
}

则:webapp

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

也就是说:ide

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

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

相关文章
相关标签/搜索