該文章是基於apkplug V1.6.8 進行說明的
該 IMThemeDemo 實現了簡單的聊天泡泡切換功能,同時主題包(外掛程式)是託管在apkplug的雲端服務器上的。所以要閱讀項目的完整代碼可以先看外掛程式託管服務開發系列文章 <外掛程式託管服務開發指南>
demo運行:
上一篇文章我們實現了主應用的開發,本篇應用我們開發主題包(外掛程式)。
一,主題包說明
apkplug主題(換膚)解決方案中的主題包本質上是一個完整的apk應用程式或者說是apkplug的外掛程式,但它有以下的不同
1.主題包對外提供主題樣式資源。
2.主題包必須上傳apkplug官網進行編譯,產生的apk才能提供主題切換。否則即為普通apk
二,主題包(外掛程式)搭建
1.按照普通app建立流程建立安卓工程
2.按照apkplug外掛程式開發流程添加必要檔案
osgi.jar應使用osgi1.6.8.jar
3.將主應用匯出的主題切換介面jar包(IMTheme.jar)匯入工程
com.apkplug.imthemedemo.themeinterface.chatstyles
三,建立主題控制項樣式資源
與普通app開發一樣,我們建立一些用於聊天泡泡按鈕背景的資源,它們可以是圖片或者xml樣式,最終都將以R.id的形式傳遞給主應用進行替換
四,添加主應用約定的chatstyles服務
com.apkplug.imtheme1.SimpleBundle
01 |
ServiceReference reference=mcontext.getServiceReference(ThemeControl.class.getName()); |
03 |
ThemeControl service=(ThemeControl) mcontext.getService(reference); |
05 |
service.addStyles(mcontext, chatstyles.class.getName(), |
08 |
public int chat_left_msg_background() { |
09 |
return R.drawable.chat_btn_left; |
12 |
public int chat_right_msg_background() { |
13 |
return R.drawable.chat_btn_right; |
16 |
public int Version() { |
20 |
public int chatbackground() { |
21 |
return R.drawable.menu_background; |
26 |
mcontext.ungetService(reference); |
注意:此時僅是添加並未真正設定為可替換的樣式(主應用ThemeChengFactory介面監聽不到)。只有當該主題包被設定為主題以後才會真正註冊。
五,將主題包設定為apkplug架構當前可用替換主題包
com.apkplug.imtheme1.MainActivity
01 |
public void setTheme1(int themeid) throws Exception{ |
02 |
BundleContext mcontext=BundleContextFactory.getInstance().getBundleContext(); |
03 |
ServiceReference reference=mcontext.getServiceReference(ThemeControl.class.getName()); |
05 |
ThemeControl service=(ThemeControl) mcontext.getService(reference); |
07 |
//設定自身為apkplug架構當前可用主題包 |
08 |
service.setTheme(mcontext, mcontext.getBundle(),themeid); |
10 |
mcontext.ungetService(reference); |
這一步在介面表現為使用者點擊以下按鈕:
使用者點擊此按鈕以後該主題包被設定為apkplug層主題,且ThemeChengFactory也將監聽到該主題包SimpleBundle中所提供的chatstyles介面服務,同時com.apkplug.imthemedemo.activity.MainActivity也將監聽到主題切換事件從而重繪介面。
六,注意事項
主題包之間如果資源重用會引起資源衝突,所以我們應當隔離兩個主題包之間的資源。通過在主題包
AndroidManifest.xml 檔案中配置
禁止主題包activity使用apkplug層的主題,從而防止資源衝突
2 |
android:name=com.apkplug.imtheme1.MainActivity |
3 |
android:label=@string/app_name > |
4 |
<meta-data android:name=apkplug-theme android:value=Main-Bundle-Hide>meta-data> |
6 |
<action android:name=android.intent.action.MAIN /> |
7 |
<category android:name=android.intent.category.LAUNCHER /> |
七,打包源碼包並上傳伺服器編譯
主題包與普通外掛程式有所不同,不能在本地編譯器進行編譯,需要將源碼包上傳伺服器進行編譯產生apk檔案
1.打包源碼包
注意:源碼包內不能包含中文名稱的檔案或路徑,打包檔案zip格式且為根路徑
2.上傳雲端服務器編譯產生apk主題包
3.編譯成功以後下載apk主題包
該主題包是未簽名主題包,開發人員可用簽名工具自行簽名,主題包所有的資源與檔案著作權都歸開發人員所有
八,將主題包(外掛程式)安裝到主應用中
我們得到的主題包apk檔案是一個完整的app外掛程式,通過apkplug提供的介面可以安裝到主應用中
九,IMThemeDemo項目簡單說明
IMThemeDemo外掛程式管理與安裝是使用的apkplug外掛程式託管服務,可查看相關教程瞭解