本案例采用設(shè)置多個(gè)activity-alias的方式燕少,要求內(nèi)置好需要更換的圖標(biāo)
1卡者、AndroidManifest文件添加activity-alias 基操蒿囤,網(wǎng)上搜
<application
......
<!--設(shè)置啟動模式為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,在啟動頁中處理相關(guān)切換,重要的是將啟動頁啟動模式設(shè)置為singleInstance底挫,這樣在執(zhí)行切換時(shí)不會殺死其他任務(wù)棧的頁面
//通過服務(wù)器接口獲取切換的參數(shù)恒傻,對比本地SharedPreferences記錄的參數(shù),如不一致建邓,執(zhí)行切換盈厘,在啟動頁跳轉(zhuǎn)到主頁時(shí),在啟動頁的onDestroy中切換
@Override
protected void onDestroy() {
//偽代碼官边,服務(wù)器返回參數(shù)與本地不一致沸手,需要切換
if (!icon_serve.equals(icon_local)){
disableLogo();
enableLogo();
}
super.onDestroy();
}
//在頁面執(zhí)行 super.onDestroy();之前,切換icon注簿,切換icon會殺掉任務(wù)棧的任務(wù)契吉,
//所以給LauncherActivity設(shè)置為singleInstance,如此只會殺掉LauncherActivity诡渴,其他啟動的頁面不受影響
//這樣并不會讓應(yīng)用退出捐晶,
//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();
//當(dāng)前需要設(shè)置disable的activity-alias的name
ComponentName componentName = new ComponentName(this, getPackageName() + ".NormalLauncherActivity");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
3、總結(jié)
都是網(wǎng)上找來的方法妄辩,也有很多坑惑灵,大家多找找看看,大致就是不要隨意更改已經(jīng)添加的activity-alias眼耀,最好只增不減不改英支。本文主要是寫切換icon不殺死應(yīng)用,做到無感知切換的方案哮伟,大致就是執(zhí)行enableLogo()和disableLogo()會使任務(wù)棧任務(wù)殺死潭辈,但我們只需要給啟動頁一個(gè)單獨(dú)的任務(wù)棧singleInstance,只殺死此棧內(nèi)任務(wù)澈吨,不影響應(yīng)用其他任務(wù)棧把敢,既可使應(yīng)用正常運(yùn)行,且完成icon切換谅辣,這種方式比“監(jiān)測應(yīng)用處于后臺切換”要好修赞,當(dāng)應(yīng)用處于后臺被殺,也是會影響用戶使用的撒