应用动态切换图标使用activity-alias和PackageManager来实现.
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>
在动态切换的代码中出现一个问题,原代码:
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方法的时候,一定得看方法注释!