應用動態(tài)切換圖標使用activity-alias和PackageManager來實現(xiàn).
manifests文件:
<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=".MainActivity-second"
android:targetActivity=".MainActivity"
android:enabled="false"
android:icon="@mipmap/ic_launcher_second"
android:label="Second">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
在動態(tài)切換的代碼中出現(xiàn)一個問題磺平,原代碼:
getPackageManager().setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
getPackageManager().setComponentEnabledSetting(new ComponentName(this,
getPackageName() + ".MainActivity-second"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
切換后晤斩,桌面需要很長的時間(不同的ROM有差別)才能將圖標切換過來吕粗。
網上有一個解決方法大致如下:
//干掉桌面app,讓它自動重啟万牺。
ActivityManager am = (ActivityManager)ctx.getSystemService(Activity.ACTIVITY_SERVICE);
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
i.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> resolves = pm.queryIntentActivities(i, 0);
for (ResolveInfo res : resolves) {
if (res.activityInfo != null) {
am.killBackgroundProcesses(res.activityInfo.packageName);
}
}
該方法可能比較老阳掐,在某些ROM上可以,某些還是很慢武福,不靠譜啊议双。
找來找去,終于在其他的代碼中找到解決方法捉片,修改flag:
getPackageManager().setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
getPackageManager().setComponentEnabledSetting(new ComponentName(this,
getPackageName() + ".MainActivity-second"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
0);
掩面淚奔平痰,如此簡單~~~
setComponentEnabledSetting方法的flag描述如下:
// @param flags Optional behavior flags: {@link #DONT_KILL_APP} or 0.
可選的動作為
DONT_KILL_APP —— 不關閉APP
0 —— 關閉APP刷新
在用Framework方法的時候,一定得看方法注釋伍纫!