天天看點

android利用apkplug架構實作主應用與插件通訊(傳遞任意對象)實作UI替換

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

利用apkplug架構實作動态替換宿主activity中的ui元素,以達到不用更新應用就可以更換ui樣式的目的。

先看效果圖:

android利用apkplug架構實作主應用與插件通訊(傳遞任意對象)實作UI替換

首先了解osgi服務的基本概念,如下圖

android利用apkplug架構實作主應用與插件通訊(傳遞任意對象)實作UI替換

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