本案例采用设置多个activity-alias的方式,要求内置好需要更换的图标
1、AndroidManifest文件添加activity-alias 基操,网上搜
<application
......
<!--设置启动模式为singleInstance-->
<activity android:name=".LauncherActivity" android:launchMode="singleInstance">
<activity-alias
android:name="NormalLauncherActivity"
android:enabled="true"
android:exported="true"
android:icon="@mipmap/app_launcher_normal"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:targetActivity=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name="Festival38LauncherActivity"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/app_launcher_38"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:targetActivity=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name="Festival51LauncherActivity"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/app_launcher_51"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:targetActivity=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
......
</application
2、切换
LauncherActivity为启动activity,在启动页中处理相关切换,重要的是将启动页启动模式设置为singleInstance,这样在执行切换时不会杀死其他任务栈的页面
//通过服务器接口获取切换的参数,对比本地SharedPreferences记录的参数,如不一致,执行切换,在启动页跳转到主页时,在启动页的onDestroy中切换
@Override
protected void onDestroy() {
//伪代码,服务器返回参数与本地不一致,需要切换
if (!icon_serve.equals(icon_local)){
disableLogo();
enableLogo();
}
super.onDestroy();
}
//在页面执行 super.onDestroy();之前,切换icon,切换icon会杀掉任务栈的任务,
//所以给LauncherActivity设置为singleInstance,如此只会杀掉LauncherActivity,其他启动的页面不受影响
//这样并不会让应用退出,
//enableLogo()方法如下:
PackageManager pm = getPackageManager();
// 假如需要切换到Festival38LauncherActivity
ComponentName componentName = new ComponentName(this, getPackageName() + ".Festival38LauncherActivity");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
//disableLogo()方法如下:
PackageManager pm = getPackageManager();
//当前需要设置disable的activity-alias的name
ComponentName componentName = new ComponentName(this, getPackageName() + ".NormalLauncherActivity");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
3、总结
都是网上找来的方法,也有很多坑,大家多找找看看,大致就是不要随意更改已经添加的activity-alias,最好只增不减不改。本文主要是写切换icon不杀死应用,做到无感知切换的方案,大致就是执行enableLogo()和disableLogo()会使任务栈任务杀死,但我们只需要给启动页一个单独的任务栈singleInstance,只杀死此栈内任务,不影响应用其他任务栈,既可使应用正常运行,且完成icon切换,这种方式比“监测应用处于后台切换”要好,当应用处于后台被杀,也是会影响用户使用的撒