动态修改安卓桌面icon

继承启动activity

网上很多说使用activity-alias的,后面看到知乎一个文章:Android动态变更图标和应用名,觉得也是写成一个activity合理一些。

这里直接继承原来的启动activity,内容为空就行:

public class NewMainActivity1 extends MainActivity {

}

在manifest内注册

这里就不用动原来的activity了,自己新写注册文件:

        <activity
            android:name=".NewMainActivity1"
            android:enabled="false"
            android:exported="true"
            android:icon="@drawable/icon"
            android:label="test1"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

以singleInstance模式新建设置activity

这里以SettingActivity为例,用一个对话框来选择图标,稍有不同的是,我这设置完会回到启动的activity,如果是使用别名应该做不到。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);

        new AlertDialog.Builder(this)
                .setTitle("设置图标activity")
                .setMessage("切换不同入口activity,在桌面显示不同得icon")
                .setNegativeButton("取消", (dialog, which) -> testMutiIcon(-1))
                .setNeutralButton("恢复", (dialog, which) -> testMutiIcon(0))
                .setPositiveButton("切换到新icon", (dialog, which) -> testMutiIcon(1))
                .create()
                .show();
    }


    private void testMutiIcon(int type) {

        PackageManager pm = getPackageManager();
        ComponentName mainComp = new ComponentName(this, "com.xxx.MainActivity");
        ComponentName new1Comp = new ComponentName(this, "com.xxx.NewMainActivity1");
        Intent intent;
        if(type == 0) {
            pm.setComponentEnabledSetting(mainComp, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
            pm.setComponentEnabledSetting(new1Comp, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
            intent = new Intent(this, MainActivity.class);
        }else if(type == 1)  {
            pm.setComponentEnabledSetting(mainComp, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
            pm.setComponentEnabledSetting(new1Comp, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
            intent = new Intent(this, NewMainActivity1.class);
        }else {
            if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == pm.getComponentEnabledSetting(mainComp)) {
                intent = new Intent(this, NewMainActivity1.class);
            }else {
                intent = new Intent(this, MainActivity.class);
            }
        }

        startActivity(intent);
        finish();
    }

这里intent这么写是因为前面activity的帐已经被销毁了,可以通过系统的任务栏查看,所以我们要重新跳转到主界面,这里MainActivity和NewMainActivity1内容是一样的,但是实际已经是两个类了。

跳转到设置

跳转和原文章写的差不多,多了个版本限制:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Intent intent = new Intent(this, SettingActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            startActivity(intent);
        }

最后

因为是上班空闲时间写的,写的不是很好。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐