• 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主程序中的资源是 在 esdrawable-hdpig.png,那么skin程序中的资源也必须在 esdrawable-hdpig.png

  • 相关阅读:
    Java web 会话技术 cookie与session
    Spring bean的bean的三种实例化方式
    Spring基础篇——通过Java注解和XML配置装配bean(转载)
    Spring的核心api和两种实例化方式
    Spring 7种事务传播类型
    leetcode 697
    leetcode 387
    Spring_002 依赖注入方式实现
    Spring_第一个Spring入门案例IOC
    谈谈对Spring IOC的理解(转载)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3573391.html
Copyright © 2020-2023  润新知