標籤: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替換