android下apkplug通用主题(皮肤)切换解决方案之主题包开发-02
2014-05-22 14:17
666 查看
该文章是基于apkplug V1.6.8 进行说明的
我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo
该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的。所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南>
demo运行效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/ca33254ee5809acd99c387902aa00d36.gif)
上一篇文章我们实现了主应用的开发,本篇应用我们开发主题包(插件)。
一,主题包说明
apkplug主题(换肤)解决方案中的主题包本质上是一个完整的apk应用程序或者说是apkplug的插件,但它有以下的不同
1.主题包对外提供主题样式资源。
2.主题包必须上传apkplug官网进行编译,生成的apk才能提供主题切换。否则即为普通apk
二,主题包(插件)搭建
1.按照普通app创建流程创建安卓工程
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0ba26c4588af3c99eae5d5747b2826f9.png)
2.按照apkplug插件开发流程添加必要文件 <apkplug插件开发>
osgi.jar应使用osgi1.6.8.jar
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0ceb01925b3b3a6086dde42e20fdfda9.png)
3.将主应用导出的主题切换接口jar包(IMTheme.jar)导入工程
com.apkplug.imthemedemo.themeinterface.chatstyles
三,创建主题控件样式资源
与普通app开发一样,我们创建一些用于聊天泡泡按钮背景的资源,它们可以是图片或者xml样式,最终都将以R.id的形式传递给主应用进行替换
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/502184aa0b0bc71c03436fee911cb458.png)
四,添加主应用约定的chatstyles服务
com.apkplug.imtheme1.SimpleBundle
注意:此时仅是添加并未真正设置为可替换的样式(主应用ThemeChengFactory接口监听不到)。只有当该主题包被设置为主题以后才会真正注册。
五,将主题包设置为apkplug框架当前可用替换主题包
com.apkplug.imtheme1.MainActivity
这一步在界面表现为用户点击以下按钮:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/3b4354ccf8804fccdcbb4518d49d5f6c.png)
用户点击此按钮以后该主题包被设置为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层的主题,从而防止资源冲突
七,打包源码包并上传服务器编译
主题包与普通插件有所不同,不能在本地编译器进行编译,需要将源码包上传服务器进行编译生成apk文件
1.打包源码包
注意:源码包内不能包含中文名称的文件或路径,打包文件zip格式且为根路径
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/e12a01745c681fec08d7dd411489c464.png)
2.上传云服务器编译生成apk主题包
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0feac332a5499d22022c0d1b67b67d2a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/99909e46423be6dd28dbfaa60039eb10.png)
3.编译成功以后下载apk主题包
该主题包是未签名主题包,开发者可用签名工具自行签名,主题包所有的资源与文件版权都归开发者所有
八,将主题包(插件)安装到主应用中
我们得到的主题包apk文件是一个完整的app插件,通过apkplug提供的接口可以安装到主应用中<apkplug插件安装>
九,IMThemeDemo项目简单说明
IMThemeDemo插件管理与安装是使用的apkplug插件托管服务,可查看相关教程了解<apkplug插件托管服务系列教程>
我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo
该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的。所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南>
demo运行效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/ca33254ee5809acd99c387902aa00d36.gif)
上一篇文章我们实现了主应用的开发,本篇应用我们开发主题包(插件)。
一,主题包说明
apkplug主题(换肤)解决方案中的主题包本质上是一个完整的apk应用程序或者说是apkplug的插件,但它有以下的不同
1.主题包对外提供主题样式资源。
2.主题包必须上传apkplug官网进行编译,生成的apk才能提供主题切换。否则即为普通apk
二,主题包(插件)搭建
1.按照普通app创建流程创建安卓工程
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0ba26c4588af3c99eae5d5747b2826f9.png)
2.按照apkplug插件开发流程添加必要文件 <apkplug插件开发>
osgi.jar应使用osgi1.6.8.jar
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0ceb01925b3b3a6086dde42e20fdfda9.png)
3.将主应用导出的主题切换接口jar包(IMTheme.jar)导入工程
com.apkplug.imthemedemo.themeinterface.chatstyles
三,创建主题控件样式资源
与普通app开发一样,我们创建一些用于聊天泡泡按钮背景的资源,它们可以是图片或者xml样式,最终都将以R.id的形式传递给主应用进行替换
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/502184aa0b0bc71c03436fee911cb458.png)
四,添加主应用约定的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); |
五,将主题包设置为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 | } |
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/3b4354ccf8804fccdcbb4518d49d5f6c.png)
用户点击此按钮以后该主题包被设置为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层的主题,从而防止资源冲突
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格式且为根路径
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/e12a01745c681fec08d7dd411489c464.png)
2.上传云服务器编译生成apk主题包
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/0feac332a5499d22022c0d1b67b67d2a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201405/22/99909e46423be6dd28dbfaa60039eb10.png)
3.编译成功以后下载apk主题包
该主题包是未签名主题包,开发者可用签名工具自行签名,主题包所有的资源与文件版权都归开发者所有
八,将主题包(插件)安装到主应用中
我们得到的主题包apk文件是一个完整的app插件,通过apkplug提供的接口可以安装到主应用中<apkplug插件安装>
九,IMThemeDemo项目简单说明
IMThemeDemo插件管理与安装是使用的apkplug插件托管服务,可查看相关教程了解<apkplug插件托管服务系列教程>
相关文章推荐
- android下apkplug通用主题(皮肤)切换解决方案之主应用-01
- apkplug主题皮肤切换之通用主题-04
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤
- apkplug主题切换功能之主题包打包编译-07
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- apkplug主题皮肤切换之自定义样式-05
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- Android 应用制定主题,QQ皮肤APK原理
- Android皮肤切换,加载其他apk的图片、布局
- Android_切换主题或皮肤的实现方式
- android 插件化 模块化开发(apkplug)
- Android应用开发中实现apk皮肤文件换肤的思路分析
- android插件化-apkplug框架启动-02
- 【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
- 【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
- 轻松实现Android 更换皮肤(主题) - 资源打包为apk,使用AssetManager动态解析调用
- 【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!