編輯:關於Android編程
該文章是基於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());
02
if(null!=reference){
03
ThemeControl service=(ThemeControl) mcontext.getService(reference);
04
if(service!=null){
05
service.addStyles(mcontext, chatstyles.class.getName(),
06
new chatstyles(){
07
@Override
08
public int chat_left_msg_background() {
09
return R.drawable.chat_btn_left;
10
}
11
@Override
12
public int chat_right_msg_background() {
13
return R.drawable.chat_btn_right;
14
}
15
@Override
16
public int Version() {
17
return 0;
18
}
19
@Override
20
public int chatbackground() {
21
return R.drawable.menu_background;
22
}
23
});
24
}
25
}
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());
04
if(null!=reference){
05
ThemeControl service=(ThemeControl) mcontext.getService(reference);
06
if(service!=null){
07
//設置自身為apkplug框架當前可用主題包
08
service.setTheme(mcontext, mcontext.getBundle(),themeid);
09
}
10
mcontext.ungetService(reference);
11
}
12
}
這一步在界面表現為用戶點擊以下按鈕:

用戶點擊此按鈕以後該主題包被設置為apkplug層主題,且ThemeChengFactory也將監聽到該主題包SimpleBundle中所提供的chatstyles接口服務,同時com.apkplug.imthemedemo.activity.MainActivity也將監聽到主題切換事件從而重繪界面。
六,注意事項
主題包之間如果資源重用會引起資源沖突,所以我們應當隔離兩個主題包之間的資源。通過在主題包
AndroidManifest.xml 文件中配置
禁止主題包activity使用apkplug層的主題,從而防止資源沖突
1
<activity
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>
5
<intent-filter>
6
<action android:name=android.intent.action.MAIN />
7
<category android:name=android.intent.category.LAUNCHER />
8
intent-filter>
9
activity>
七,打包源碼包並上傳服務器編譯
主題包與普通插件有所不同,不能在本地編譯器進行編譯,需要將源碼包上傳服務器進行編譯生成apk文件
1.打包源碼包
注意:源碼包內不能包含中文名稱的文件或路徑,打包文件zip格式且為根路徑

2.上傳雲服務器編譯生成apk主題包


3.編譯成功以後下載apk主題包
該主題包是未簽名主題包,開發者可用簽名工具自行簽名,主題包所有的資源與文件版權都歸開發者所有
八,將主題包(插件)安裝到主應用中
我們得到的主題包apk文件是一個完整的app插件,通過apkplug提供的接口可以安裝到主應用中
九,IMThemeDemo項目簡單說明
IMThemeDemo插件管理與安裝是使用的apkplug插件托管服務,可查看相關教程了解
Android開發筆記之:Splash的實現詳解
什麼是SplashSplash也就是應用程序啟動之前先啟動一個畫面,上面簡單的介紹應用程序的廠商,廠商的LOGO,名稱和版本等信息,多為一張圖片,顯示幾秒鐘後會自動消息,
通訊錄的原型實現(二)- 類似QQ好友列表實現,分組名懸浮在最頂部
上一節通訊錄原型的實現(-)中,將到了最基本最簡單的通訊錄的實現,這節就講講類似QQ好友列表的分組名稱懸浮在最頂部的實現。我的基本實現思路如下:1.使用Expandabl
Android自定義圓形倒計時進度條
效果預覽源代碼傳送門:https://github.com/yanzhenjie/CircleTextProgressbar實現與原理這個文字圓形的進度條我們在很多APP
Android游戲開發之黑白棋
黑白棋介紹黑白棋,又叫蘋果棋,最早流行於西方國家。游戲通過相互翻轉對方的棋子,最後以棋盤上誰的棋子多來判斷勝負。黑白棋非常易於上手,但精通則需要考慮許多因素,比如角邊這樣