美文网首页
Android 动态替换应用图标

Android 动态替换应用图标

作者: 安静的菜鸟 | 来源:发表于2017-04-05 14:53 被阅读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方法的时候,一定得看方法注释!

    相关文章

      网友评论

          本文标题:Android 动态替换应用图标

          本文链接:https://www.haomeiwen.com/subject/doatattx.html