分析Android App中内置换肤功能的实现方式

2019-12-10 18:58:36于丽

在安装文件时,系统会将文件取出、解压后放在Dalvik Cache中。该缓存下有许多dex文件,当用户打开应用时系统会自动加载相应的类。在加载过程中,系统如需访问APK,则需对其进行解压,这样通常导致效率较为低下。而如果将dex文件放入Dalvik Cache中,则能够令加载的效率大大提升。
每个进程都有一份关于Framework的共享类和共享资源,但物理内存空间中的系统级别资源只有一份。Framework类和资源是只读的,而Android操作系统设计之初并没有硬盘的虚拟内存和换进换出机制,所以节省内存空间是非常重要的工作。

应用程序内置资源实现换肤功能
通过应用程序内置资源实现换肤,典型的应用为QQ空间中换肤的实现. 应用场景为: 应用一般不大,且页面较少,风格相对简单,一般只用实现部分资源或者只用实现背景的更换.
此种换肤方式实现的思路:
1. 把几套皮肤放在res/drawable目录里,然后用SharedPreferences来记录当前皮肤的资源id.然后在程序启动时加载Activity背景。
2. 主要的实现在皮肤管理器SkinManager类中. 将皮肤资源的ID加入集合中. 由该类同一调度皮肤更换,如初始化皮肤,获取当前皮肤符号以及具体的对应资源的更换皮肤.

接下来看一下效果图: 

分析Android App中内置换肤功能的实现方式

分析Android App中内置换肤功能的实现方式

内置皮肤的实现相对比较简单,下面直接上代码:

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://www.easck.com/apk/res/android" 
 package="com.tony.skindemo" 
 android:versionCode="1" 
 android:versionName="1.0" > 
 
 <uses-sdk android:minSdkVersion="8" /> 
 
 <application 
  android:icon="@drawable/ic_launcher" 
  android:label="@string/app_name" > 
  <activity 
   android:label="@string/app_name" 
   android:name="com.tony.skindemo.SkinDemoActivity" > 
   <intent-filter > 
    <action android:name="android.intent.action.MAIN" /> 
 
    <category android:name="android.intent.category.LAUNCHER" /> 
   </intent-filter> 
  </activity> 
   
   
 </application> 
 
</manifest>