如何实现皮肤与应用程序分离。
皮肤一般含有多个文件,例如图片、配置等文件,分散的文件不利于传输和使用,最好打包。打包的格式一般选择zip格式。这里分两种情况,一种是apk,例如AdwLauncher,它的桌面皮肤格式是一个apk;另一种是自定义扩展名,例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。
下面我们分别讲解。
一.apk格式
现在的问题变成了一个应用如何读取另一个apk中的资源。
在android系统中,apk之间可以相互读取数据的条件是:有同样的签名,并且AndroidManifest.xml文件中配置的android:sharedUserId属性值相同,那么两个apk运行在同一个进程中,可以互相访问任意数据。
方法如下:
1) 应用程序和皮肤程序的AndroidManifest.xml中配置
例如: android:sharedUserId="org.yuchen"
2) 文件与应用apk中对同一功能的皮肤文件名要一致
例如:应用程序的背景图片路径:/SkinDemo/res/drawable-hdpi/bg.png
那么皮肤apk中的背景图片文件路径也应该是:
CustomSkin/res/drawable-hdpi/bg.png
3)访问资源的方法
获取到org.yuchen.customskin对应的Context,通过返回的context对象就可以访问到org.yuchen.customskin中的任何资源。
例如:应用apk要获得皮肤apk中的bg.png,
这样就得到了图片的引用,其他xml资源文件的获取方式也是类似的。
皮肤一般含有多个文件,例如图片、配置等文件,分散的文件不利于传输和使用,最好打包。打包的格式一般选择zip格式。这里分两种情况,一种是apk,例如AdwLauncher,它的桌面皮肤格式是一个apk;另一种是自定义扩展名,例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。
下面我们分别讲解。
一.apk格式
现在的问题变成了一个应用如何读取另一个apk中的资源。
在android系统中,apk之间可以相互读取数据的条件是:有同样的签名,并且AndroidManifest.xml文件中配置的android:sharedUserId属性值相同,那么两个apk运行在同一个进程中,可以互相访问任意数据。
方法如下:
1) 应用程序和皮肤程序的AndroidManifest.xml中配置
例如: android:sharedUserId="org.yuchen"
2) 文件与应用apk中对同一功能的皮肤文件名要一致
例如:应用程序的背景图片路径:/SkinDemo/res/drawable-hdpi/bg.png
那么皮肤apk中的背景图片文件路径也应该是:
CustomSkin/res/drawable-hdpi/bg.png
3)访问资源的方法
- Context context = createPackageContext("com.yuchen.customskin", Context.CONTEXT_IGNORE_SECURITY);
获取到org.yuchen.customskin对应的Context,通过返回的context对象就可以访问到org.yuchen.customskin中的任何资源。
例如:应用apk要获得皮肤apk中的bg.png,
这样就得到了图片的引用,其他xml资源文件的获取方式也是类似的。