Android APK方式换肤实现原理
2014-02-28 13:10
405 查看
现在很多APP都有换肤的功能,例如微博,QQ等应用。这些应用的换肤原理是什么?
在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了。
这种方式就是把皮肤打包成一个APK,然后在主程序中访问这个皮肤APK中的资源。这种方式需要涉及到两个应用之间的数据访问了。
那如何做到应用间的数据访问呢?
这就得用到Android shareUserId这个属性了。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据.
假设有一个应用叫main,一个皮肤APK叫skin,那么在main应用以及skin应用中的manifest.xml文件中需要设置shareUserId属性,都设置为cn.angrycode.main
在main应用的manifest.xml文件
在skin应用中
[/code]
这样在主应用中就可以通过代码进行设置皮肤
[/code]
这里还需要注意的是,主程序main中的资源路径以及资源名称要与skin应用中的资源路径以及资源名称要一致。例如,main主程序中的资源是 在\res\drawable-hdpi\bg.png,那么skin程序中的资源也必须在\res\drawable-hdpi\bg.png
在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了。
这种方式就是把皮肤打包成一个APK,然后在主程序中访问这个皮肤APK中的资源。这种方式需要涉及到两个应用之间的数据访问了。
那如何做到应用间的数据访问呢?
这就得用到Android shareUserId这个属性了。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据.
假设有一个应用叫main,一个皮肤APK叫skin,那么在main应用以及skin应用中的manifest.xml文件中需要设置shareUserId属性,都设置为cn.angrycode.main
在main应用的manifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.angrycode.main" android:versionCode="1" android:versionName="1.0" android:sharedUserId="cn.angrycode.main"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
在skin应用中
[code]<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.angrycode.skin" android:versionCode="1" android:versionName="1.0" android:sharedUserId="cn.angrycode.main"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> </application> </manifest>
[/code]
这样在主应用中就可以通过代码进行设置皮肤
[code]Context ctx = createPackageContext("cn.angrycode.skin", Context.CONTEXT_IGNORE_SECURITY); layout.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.bg));
[/code]
这里还需要注意的是,主程序main中的资源路径以及资源名称要与skin应用中的资源路径以及资源名称要一致。例如,main主程序中的资源是 在\res\drawable-hdpi\bg.png,那么skin程序中的资源也必须在\res\drawable-hdpi\bg.png
相关文章推荐
- Android 换肤功能的实现(Apk插件方式)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- android换肤功能实现(apk方式)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
- 在Android中实现推送方式的底层原理与推送的知识及相关解决方案
- Android静默方式实现批量安装卸载APK
- Android中的Apk的加固(加壳)原理解析和实现
- Android动态换肤(二、apk免安装插件方式)
- Android中的Apk的加固(加壳)原理解析和实现(转)
- Android进阶2之APK方式换肤
- Android进阶2之APK方式换肤
- Android应用实现「类方法指令抽取方式」加固方案原理解析
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)
- 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案
- 【Android应用开发】-(19)Android 串口编程原理和实现方式
- Android中的Apk的加固(加壳)原理解析和实现