Android APK方式换肤实现原理
現在很多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文件
<?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應用中
<?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>
這樣在主應用中就可以通過代碼進行設置皮膚
Context ctx = createPackageContext("cn.angrycode.skin", Context.CONTEXT_IGNORE_SECURITY);layout.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.bg));
這里還需要注意的是,主程序main中的資源路徑以及資源名稱要與skin應用中的資源路徑以及資源名稱要一致。例如,main主程序中的資源是 在\res\drawable-hdpi\bg.png,那么skin程序中的資源也必須在\res\drawable-hdpi\bg.png
轉載于:https://www.cnblogs.com/Free-Thinker/p/3573391.html
總結
以上是生活随笔為你收集整理的Android APK方式换肤实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sharepoint指定的人可以看到列表
- 下一篇: ARM体系结构及内核回顾总结(一)