Phonegap外掛編寫 Java物件導向方法

鴨脖發表於2012-07-02

上一篇博文中我轉載了別人寫的phonegap的編寫方法,簡單回顧一下:

cordova中有Plugin這個類,編寫的外掛繼承於這個類,其中有exec這個方法,根據第二個引數的命令進行判斷,來決定該執行什麼動作。所有的外掛都要重寫這個exec方法。然後通過plugin.xml的修改,來增加外掛的記錄。然後便是寫js了。js通過cordova的exec這個方法來實現js和java之間的通訊。然後可以通過window。plugin。*來使用定義好的js外掛。很顯然,在java中的程式碼是帶著程式導向的思想的,而真正的物件導向的思想似乎是在js中體現的更加充分一點。

 java是典型的物件導向的高階語言,這似乎顯得有點屈才。所以我找到了一種更加簡單的方法來開發phonegap外掛。使得js和java相關連只需要在主類(主類繼承自Droidap)通過appView的addJavascriptInterface()這個方法,便可以實現js和java的關聯。java程式碼還是按照物件導向的思想。那個方法的兩個引數,一個是java物件,一個是js物件,然後我們便可以在js中通過js來使用java物件。與那個java物件相關聯的其他java物件都可以獲取直接使用。這個interface就好比是js通向java的一個洞,你通過這個洞看到的java物件都可以在js中直接使用。


下面貼出一段例項程式:

package com.yelbosh.plugin;


import org.apache.cordova.DroidGap;


import android.content.Context;
import android.telephony.TelephonyManager;
import android.webkit.WebView;
import com.yelbosh.plugin.People;


public class MyClass {
 private WebView mAppView;
 private DroidGap mGap;


 public MyClass(DroidGap gap, WebView view)
 {
   mAppView = view;
   mGap = gap;
 }


 public String getTelephoneNumber(){
   TelephonyManager tm = 
     (TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
   String number = tm.getLine1Number();
   //String number = "11111";
   return number;
 }
 public People getPeople(){
 People mypeo = new People("hahah");
 return mypeo;
 }
}


這是定義的外掛,其中還使用了People這個類。那麼People類的定義如下:

package com.yelbosh.plugin;


public class People {
private String name;
public People(String name){
this.name = name;
}
public String getName(){
return this.name;
}


在主類中定義如下:

public class MainActivity extends DroidGap {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        super.loadUrl("file:///android_asset/www/test.html");
        appView.addJavascriptInterface(new MyClass(this,this.appView), "MyCls");
    }


在js程式碼中通過MyCls這個物件便可以直接使用MyClass物件,使用方法是一樣的。

注意加上window,這是全域性變數。因為是直接定義在瀏覽器中的。

a= window.MyCls.getPeople()

alert(a.getName())

就能得到想要的結果。


仔細想一想,其實編寫外掛的過程就是擴充套件瀏覽器的過程,使得js程式碼能夠知道那些外掛是幹什麼的。

那麼,phonegap的原理是什麼呢?

Android:通過攔截JavaScript的prompt命令實現從JavaScript到原生程式碼的通訊。JavaScript prompt命令預設會彈出對話方塊,而PhoneGap的Android原生程式碼會攔截該對話方塊,並進一步取得JavaScript資料。相應的,Android上的PhoneGap內部,使用Java實現了一個HTTP伺服器,通過永續性的XHR連線,JavaScript可以不斷輪詢內部XHR伺服器儲存的資訊,從而實現了從Java到JavaScript方向的通訊。

phonegap外掛大多都是在功能上而並非是views上,所以你儘管隨便寫。


自己編寫好的外掛可以通過打包,供以後使用。但是注意在主類中做add宣告。或許這可以通過xml來實現。


相關文章