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工具

相關文章
相關標籤/搜索