該文章是基於apkplug V1.6.8 進行說明的 java
咱們提供了一個demo作爲參考,項目下載地址爲:http://git.oschina.net/plug/IMThemeDemo android
該 IMThemeDemo 實現了簡單的聊天泡泡切換功能,同時主題包(插件)是託管在apkplug的雲服務器上的。因此要閱讀項目的完整代碼能夠先看插件託管服務開發系列文章 <插件託管服務開發指南> git
demo運行效果圖: 服務器
上一篇文章咱們實現了主應用的開發,本篇應用咱們開發主題包(插件)。 app
一,主題包說明 框架
apkplug主題(換膚)解決方案中的主題包本質上是一個完整的apk應用程序或者說是apkplug的插件,但它有如下的不一樣 ide
1.主題包對外提供主題樣式資源。 工具
2.主題包必須上傳apkplug官網進行編譯,生成的apk才能提供主題切換。不然即爲普通apk post
二,主題包(插件)搭建 spa
1.按照普通app建立流程建立安卓工程
2.按照apkplug插件開發流程添加必要文件 <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
ServiceReference reference=mcontext.getServiceReference(ThemeControl.class.getName()); if(null!=reference){ ThemeControl service=(ThemeControl) mcontext.getService(reference); if(service!=null){ service.addStyles(mcontext, chatstyles.class.getName(), new chatstyles(){ @Override public int chat_left_msg_background() { return R.drawable.chat_btn_left; } @Override public int chat_right_msg_background() { return R.drawable.chat_btn_right; } @Override public int Version() { return 0; } @Override public int chatbackground() { return R.drawable.menu_background; } }); } } mcontext.ungetService(reference);
注意:此時僅是添加並未真正設置爲可替換的樣式(主應用ThemeChengFactory接口監聽不到)。只有當該主題包被設置爲主題之後纔會真正註冊。
五,將主題包設置爲apkplug框架當前可用替換主題包
com.apkplug.imtheme1.MainActivity
public void setTheme1(int themeid) throws Exception{ BundleContext mcontext=BundleContextFactory.getInstance().getBundleContext(); ServiceReference reference=mcontext.getServiceReference(ThemeControl.class.getName()); if(null!=reference){ ThemeControl service=(ThemeControl) mcontext.getService(reference); if(service!=null){ //設置自身爲apkplug框架當前可用主題包 service.setTheme(mcontext, mcontext.getBundle(),themeid); } mcontext.ungetService(reference); } }
這一步在界面表現爲用戶點擊如下按鈕:
用戶點擊此按鈕之後該主題包被設置爲apkplug層主題,且ThemeChengFactory也將監聽到該主題包SimpleBundle中所提供的chatstyles接口服務,同時com.apkplug.imthemedemo.activity.MainActivity也將監聽到主題切換事件從而重繪界面。
六,注意事項
主題包之間若是資源重用會引發資源衝突,因此咱們應當隔離兩個主題包之間的資源。經過在主題包
AndroidManifest.xml 文件中配置
<meta-data android:name="apkplug-theme" android:value="Main-Bundle-Hide"></meta-data>
禁止主題包activity使用apkplug層的主題,從而防止資源衝突
<activity android:name="com.apkplug.imtheme1.MainActivity" android:label="@string/app_name" > <meta-data android:name="apkplug-theme" android:value="Main-Bundle-Hide"></meta-data> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
七,打包源碼包並上傳服務器編譯
主題包與普通插件有所不一樣,不能在本地編譯器進行編譯,須要將源碼包上傳服務器進行編譯生成apk文件
1.打包源碼包
注意:源碼包內不能包含中文名稱的文件或路徑,打包文件zip格式且爲根路徑
2.上傳雲服務器編譯生成apk主題包
3.編譯成功之後下載apk主題包
該主題包是未簽名主題包,開發者可用簽名工具自行簽名,主題包全部的資源與文件版權都歸開發者全部
八,將主題包(插件)安裝到主應用中
咱們獲得的主題包apk文件是一個完整的app插件,經過apkplug提供的接口能夠安裝到主應用中<apkplug插件安裝>
九,IMThemeDemo項目簡單說明
IMThemeDemo插件管理與安裝是使用的apkplug插件託管服務,可查看相關教程瞭解<apkplug插件託管服務系列教程>