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

2019-04-04  本文已影响0人  已迁至知乎_此不再维护
from flickr.com

在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();
        }
}

则:

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

也就是说:

  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

上一篇下一篇

猜你喜欢

热点阅读