1. 动态更换应用Icon
原理 1 ---activity-alias
在AndroidManifest.xml 中,有两个属性:
<intent-filter> // 决定应用程序最新启动的activity <action android:name="android.intent.action.MAIN" /> // 决定应用程序是否显示在程序列表 <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> |
另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口,可以参考系统setting和launcher系统源码。
原理2 --- PM.setComponentEnabledSetting
PackageManager是一个大统领类,可以管理所有的系统组件,如果root后,还可以管理其他App的所有组件,一些系统优化工具就是通过这个方式禁用一些后台service的。
使用方式异常简单:
private void enableComponent(ComponentName componentName){ mPm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager. DONT_KILL_APP); }
private void disableComponent(ComponentName componentName){ mPm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager. DONT_KILL_APP); }
|
以上两个方法控制组件是否启用。
动态更换Icon
基于上面的两个原理,来实现动态更换Icon。
首先,创建一个Activity,作为默认的入口并带着默认的图片,再创建一个双11的activity-alias,指向默认的Activity并带双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片…等等。
<activity android:name=".MainActivity" > <intent-filter > <action android:name=" android.intent.action.MAIN " /> <category android:name=" android.intent.category.LAUNCHER " /> </intent-filter> </activity>
<activity-alias android:name=".Test11" android:enabled="false" android:label="双11" android:icon="@drawable/s11" android:targetActivity=".MainActivity"> <intent-filter > <action android:name=" android.intent.action.MAIN " /> <category android:name=" android.intent.category.LAUNCHER " /> </intent-filter> </activity-alias> <activity-alias android:name=".Test12" android:enabled="false" android:label="双12" android:icon="@drawable/s12" android:targetActivity=".MainActivity"> <intent-filter > <action android:name=" android.intent.action.MAIN " /> <category android:name=" android.intent.category.LAUNCHER " /> </intent-filter> </activity-alias>
|
这样配置的话,就可以在Lanucher显示2个入口,所以默认会把这些activity-alias先禁用,等到用时再启用。
如下是应用java代码:
public class MainActivity extends AppCompatActivity{ private ComponentName mDefault; private ComponentName mDouble11; private ComponentName mDouble12; private PackageManager mPm;
@Override protected void onCreate(Bundle savedInstanceState){ super. onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mDefault = getComponentName(); mDouble11 = new ComponentName(getBaseContext(),”com.jxh.Test11”); mDouble12 = new ComponentName(getBaseContext(),”com.jxh.Test12”); mPm = getApplicationContext().getPackageManager();
} public void changeIcon11(View view){ disableComponent(mDefault); disableComponent(mDouble12); enableComponent(mDouble11); } public void changeIcon12(View view){ disableComponent(mDefault); disableComponent(mDouble11); enableComponent(mDouble12); }
private void enableComponent(ComponentName componentName){ mPm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager. DONT_KILL_APP); } private void disableComponent(ComponentName componentName){ mPm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager. DONT_KILL_APP); } } |
主界面主要是两个按钮,一个双11,一个双12,点击可以调用对应的函数即可。