Android 與 JavaScript 互動 支援的資料型別

鍵筆刀發表於2019-04-04

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工具類進行相互轉化;

參見: stackoverflow.com/questions/2…

相關文章