在android系统中,每一个application是一个进程和一个用户,不同的进程间是不能互相访问的。如果想让两个程序之间可以相互访问其资源,就可以让这两个apk运行在同一个进程里就可以。要让两个apk运行在同一个进程里,要满足两个条件:相同的sharedUserId和用相同的证书进行签名
默认情况下,如果不配android:sharedUserId,则其userid与包名相同,所以我们可以把皮肤包的android:sharedUserId与主apk配置的相同,再用相同的签名打包,就可以共享资源。
以上是打皮肤包方法,但真正把这个方案用在复杂一点的项目里时,问题会很多。比如按照上面的方法,在主apk里怎样获取皮肤包的图片:
try {
mSkin1Context = this.createPackageContext("com.ly.skin1", CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
mSkin1Context = this;
}
Drawable drawable = mSkin1Context.getResources().getDrawable(R.drawable.image1);
用上面的方法有一个要求,就是在主程序和皮肤程序里都要有image1图片,但这两张图片的内容是不一样的。
这样感觉只要资源的名称相同就行了,但关键是R.drawable.image1是一个常量,在编译阶段会用常量的值替换掉这个变量,问题就出来了,尽管主apk和皮肤包有相同名称的图片,但如果他们的值不一样,则也会出错。
R文件里的常量的值不是只与其本身资源的名称有关,还与所有的图片名称有关,只有保证皮肤包和主apk有完全相同的图片名称(所有),才能保证其生成的常量的值也相同。
针对上面的问题的解决办法:
如果不想皮肤包太大,可以用item属性:
<item type="drawable" name="icon"/>
<item type="drawable" name="image1"/>
<item type="drawable" name="image3"/>
这样也可以在R文件里的Drawable类里添加上面三个常量。
注意:上面的三个图片,icon,image1,image3可以在资源文件里已经存在了,也可以在这里再写一遍,但其他的layout属性不可以这样做,只能写没有出现过的。
共享layout文件
上面只讲了换图片方法,即然是资源全部共享,其实还可以共享其layout文件,这样可以改变其布局文件,包括字体颜色和位置。
同样的问题,R.layout.xxx也是常量,在编译期间都会替换成数值,为了保证其生成的常量的值都相同,我们可以让皮肤包和主apk的布局文件一样,也可以用上面的item标签,但注意item里的与layout里的,不能重复,但drawable可以。
还有一个问题就是id值,id值也可以在item里写,这样在其他的layout文件里就不要用@+id/xxx,直接用@id/xxx就可以了,但我测出一个问题,如果把id全部都写在layout文件里,和全部都写在item里,其常量的值不一样,所以只能选一样方法。
讲讲用这种方法进行换肤的缺点:
1. 由于其常量的值与整个资源都有关系,所以一个皮肤包只能与一个特定的版本相关联,每个版本都要用其独立的皮肤包,以前的不能重用,因为在新的版本里,其资源一般都会发生变化。
2. 如果想让皮肤包小一点话,就要为不能的手机分辨率打不同的apk包
3. 由于不同的版本之间不能共用皮肤包,所以用户更新新版本后,只有手动才能把老的皮肤包删除掉,但用户区分哪个是老的皮肤包,比较麻烦。
4. 为了维护的方便,一般是把每个版本拥有的皮肤包的地址写死在客户端。
分享到:
相关推荐
apk方式实现android应用程序换肤。 文章:http://blog.csdn.net/hailushijie/article/details/9454679
Android 换肤功能的实现(Apk插件方式)源码 技术方案是:将皮肤图片资源以独立的Apk安装包的方式提供,做成插件化的方式。便于管理。
在Android中实现界面切换的例子,一共有2个Android换肤实例,都是挺简单的,只演示了基本的换肤原理,都生成有APK文件,可拷贝到android手机运行看效果,在些不多做介绍了,Android换肤相信是个实用的功能。
android下换肤实现,类似go桌面的方式
android apk换肤法,将皮肤封装成APK文件,实现换肤
APK方式换肤
有两个工程,宿主中加载插件apk中的图片实现换肤功能,使用反射+类加载器实现。
动态加载未安装apk资源,无需安装apk,实现换肤;
可实现换肤功能,apk和zip方式,详情请看eoeanroid站内换肤博客
文章:http://blog.csdn.net/hailushijie/article/details/9454679
实现Android的换肤的功能,通过APK安装进行实现,可以更换布局与背景
本文分析了Android实现换肤的两种思路。分享给大家供大家参考,具体如下: 这里来了解换肤实现及不同方案的差异和使用场合。 一、从功能上划分 1) 软件内置多个皮肤,用户不能修改; 2) 官方提供皮肤下载,用户使用...
android的趣味应用,可以使你的程序的用户体验度更高。
在本篇文章里小编给大家整理的是关于Android实现apk插件方式换肤的实例代码以及相关知识点,有需要的朋友们学习下。
Android皮肤支持:一种Android换肤框架,极低的学习成本,极好的用户体验。 只需要一行代码,就可以实现换肤,你值得拥有!!! SkinCompatManager . withoutActivity( this ) . loadSkin(); 就这么简单,你的APK已经...
两个apk直接互相调用资源,里面实现了 两个apk直接调用资源,还有类的调用
Android-Skin:极简单的android换肤框架,无缝支持第三方控件,一行代码即可换肤,集成成本极低, 提供丰富的API支持拓展,对业务代码几乎无入侵。 AndroidSkin.getInstance().saveSkinAndApply(skinFilePath, ...
Android换肤技术总结 背景 纵观现在各种Android app,其换肤需求可以归为 – 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher。 – 多种主题切换,通常为会员...
在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。 由于linux平台的安全机制,再...而在Android中的实现思路,即为将一个较大的APK,分离为一个主程序的APK,和其他各