android利用apkplug架構實現主應用與外掛程式通訊(傳遞任意對象)實現UI替換

來源:互聯網
上載者:User

標籤:android   apkplug   osgi   模組化   外掛程式   

 時光匆匆,乍一看已半年過去了,經過這半年的埋頭苦幹今天終於有滿血複活了。

利用apkplug架構實現動態替換宿主Activity中的UI元素,以達到不用更新應用就可以更換UI樣式的目的。

先看:

 

首先理解OSGI服務的基本概念,如

1.首先定義一個java介面(interface)用於規範宿主與外掛程式之間的通訊協議

  interface  com.apkplug.osgi.service.showView

                void showView(Bundle bundle,View v,int index) ;  //添加View

                void removeView(Bundle bundle,View v);            //刪除View

2.決定osgi服務提供者和使用者 ,這裡我們定義是 宿主應用為"OSGI服務提供者",外掛程式為"OSGI服務使用者"。

  註:OSGI服務提供者 註冊服務  OSGI服務使用者 查詢服務

3.宿主應用實現showView介面,相應類為 com.apkplug.osgi.serviceImp.showViewImp 具體代碼如下:

public class showViewImp implements showView{private LinearLayout layout =null;/** * @param root 外掛程式 View儲存UI容器  */public showViewImp(View root){this.layout=(LinearLayout)root;}@Overridepublic void showView(Bundle bundle, View v, int index) {//當外掛程式尋找到服務並使用時回調System.out.println("外掛程式傳來一個View");layout.addView(v);}@Overridepublic void removeView(Bundle bundle, View v) {System.out.println("外掛程式需要刪除一個View");layout.removeView(v);}}


4.宿主應用將showViewImp以服務的形式註冊都OSGI中,具體代碼在com.apkplug.osgi.activity.ViewActivator中

   注意:

       1:我們將宿主應用也虛擬為一個OSGI Bundle(外掛程式) ,這樣它便擁有了與其他外掛程式進行OSGI通訊的條件。

       2:並且 宿主程式(外掛程式)在架構啟動的時候便被啟動(這樣showView服務就最先被註冊上了,以後其他外掛程式就可以尋找到)

       3:每一個OSGI Bundle都有一個實現BundleActivator

   ViewActivator implements BundleActivator

public abstract interface BundleActivator{    //外掛程式啟動時調用    public abstract void start(BundleContext context) throws Exception;    //外掛程式停止時調用    public abstract void stop(BundleContext context) throws Exception;}

由於ViewActivator代碼較多這裡只貼出與服務註冊相關的代碼

........public void start(final BundleContext context) {//註冊一個服務給外掛程式調用m_reg = context.registerService(showView.class.getName(),showView,            null);                  .......                  .......

5.編寫外掛程式,在外掛程式的BundleActivator實作類別中查詢showView服務,並且初始化一個自身的View做為參數傳遞給宿主應用

  外掛程式的BundleActivator實作類別為: com.apkplug.osgiclient1.SimpleBundle implements BundleActivator

查詢showView服務的相關代碼為:

//外掛程式自訂View  myBtn        myBtn=new myBtn(context.getBundleContext());       //查詢主程式提供的showView服務        ServiceReference ref  =  context.getServiceReference(showView.class.getName());        if  (ref  !=   null ) {         //  擷取Service執行個體         showView service  =  (showView) context.getService(ref);         if  (service  !=   null ) {         //  調用Service方法          service.showView(context.getBundle(), myBtn, 0);         //  釋放Service,在此之後不應該再繼續使用Service執行個體          context.ungetService(ref);         }        } 

總結: 經過以上步驟便完成了外掛程式-->宿主的View對象傳遞並顯示的過程。

結合OSGI服務我們通過自訂java介面類,並且適當轉換OSGI服務者與使用者的角色來完成我們所需要的各種互交。

注:OSGI服務除了查詢方式外,還提供監聽器的方式(服務者可在使用者後啟動註冊服務) 詳細demo也可參考osgiService的printLog服務註冊與監聽方式。

最後源碼地址 http://git.oschina.net/plug/OSGIService

QQ交流群:132433459

android利用apkplug架構實現主應用與外掛程式通訊(傳遞任意對象)實現UI替換

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.