Android 动态替换应用图标

2017-04-05  本文已影响0人  安静的菜鸟

应用动态切换图标使用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方法的时候,一定得看方法注释!

上一篇下一篇

猜你喜欢

热点阅读