時光匆匆,乍一看已半年過去了,經過這半年的埋頭苦幹今天終于有滿血複活了。
利用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 具體代碼如下:
4.宿主應用将showviewimp以服務的形式注冊都osgi中,具體代碼在com.apkplug.osgi.activity.viewactivator中
注意:
1:我們将宿主應用也虛拟為一個osgi bundle(插件) ,這樣它便擁有了與其他插件進行osgi通訊的條件。
2:并且 宿主程式(插件)在架構啟動的時候便被啟動(這樣showview服務就最先被注冊上了,以後其他插件就可以查找到)
3:每一個osgi bundle都有一個實作bundleactivator
viewactivator implements bundleactivator
由于viewactivator代碼較多這裡隻貼出與服務注冊相關的代碼
5.編寫插件,在插件的bundleactivator實作類中查詢showview服務,并且初始化一個自身的view做為參數傳遞給宿主應用
插件的bundleactivator實作類為: com.apkplug.osgiclient1.simplebundle implements bundleactivator
查詢showview服務的相關代碼為:
總結: 經過以上步驟便完成了插件-->宿主的view對象傳遞并顯示的過程。
結合osgi服務我們通過自定義java接口類,并且适當轉換osgi服務者與使用者的角色來完成我們所需要的各種互交。
注:osgi服務除了查詢方式外,還提供監聽器的方式(服務者可在使用者後啟動注冊服務) 詳細demo也可參考osgiservice的printlog服務注冊與監聽方式。
最後源碼位址
qq交流群:132433459