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