博客
关于我
android关于动态的切换app图标问题
阅读量:130 次
发布时间:2019-02-26

本文共 4903 字,大约阅读时间需要 16 分钟。

先讨论实现步骤:

1.在AndroidManifest.xml里添加 标签,并且 启动页 的标签要先去掉,在它所属的每个 里加上 就好了

2.在换图标的activity里:

//在onCreat()方法里:
cl_defaultIcon = findViewById(R.id.cl_defaultIcon);    cl_defaultIcon.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            switchIcon(1);        }    });    cl_mapIcon = findViewById(R.id.cl_mapIcon);    cl_mapIcon.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            switchIcon(2);        }    });    cl_mailIcon = findViewById(R.id.cl_mailIcon);    cl_mailIcon.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            switchIcon(3);        }    });
private void switchIcon(int useCode) {        try {            //要跟manifest的activity-alias 的name保持一致            String icon_tag_default = getPackageName() + ".appIcon1";            String icon_tag_map = getPackageName() + ".appIcon2";            String icon_tag_mail = getPackageName() + ".appIcon3";                        if (useCode != 11) {                PackageManager pm = getPackageManager();                ComponentName defaultComponentName = new ComponentName(this, icon_tag_default);                int defaultState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;                if (pm.getComponentEnabledSetting(defaultComponentName) != defaultState) {                    //正常图标新状态//                    new Handler().postDelayed(new Runnable() {//                        @Override//                        public void run() {//                            showAuditDialog();//                        }//                    }, 3000);                    //新状态跟当前状态不一样才执行                    pm.setComponentEnabledSetting(                            defaultComponentName,                            defaultState,                            PackageManager.DONT_KILL_APP);                    Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();                } else {                    if (useCode == 1) {                        Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();                        Log.e(TAG,"和当前版本一样1");                    }                }                //2.地图                ComponentName actComponentMap = new ComponentName(this, icon_tag_map);                //正常图标新状态                int actMapState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;                if (pm.getComponentEnabledSetting(actComponentMap) != actMapState) {                    //PackageManager.DONT_KILL_APP表示执行此方法时不杀死当前的APP进程                    pm.setComponentEnabledSetting(                            actComponentMap,                            actMapState,                            PackageManager.DONT_KILL_APP);                    Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();                } else {                    if (useCode == 2) {                        Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();                        Log.e(TAG,"和当前版本一样2");                    }                }                //3.邮件                ComponentName actComponentMail = new ComponentName(this, icon_tag_mail);                //正常图标新状态                int actMailState = useCode == 3 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;                if (pm.getComponentEnabledSetting(actComponentMail) != actMailState) {                    pm.setComponentEnabledSetting(                            actComponentMail,                            actMailState,                            PackageManager.DONT_KILL_APP);                    Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();                } else {                    if (useCode == 3) {                        Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();                        Log.e(TAG,"和当前版本一样3");                    }                }            }        } catch (Exception e) {        }    }

以上基本是实现app图标换肤所需的代码

关于可能会遇到的闪退问题

一定要用这个PackageManager.DONT_KILL_APP,网上有些是PackageManager.其它的…
PackageManager.DONT_KILL_APP表示执行此方法时不杀死当前的APP进程

用这个换图标会退出到桌面,然后生成新的图标,这是效果,

我优化之处:如果切换的图标是存在的图标,会有Toas提示,大家要想加个DIaLog自定义弹窗提示,就写个方法在if里面展示下就好了
如果没解决请联系我;
qq:1393508286

转载地址:http://bxqu.baihongyu.com/

你可能感兴趣的文章
MySQL数据库 范式
查看>>
Mysql数据库B-Tree索引
查看>>
mysql数据库io空闲_mysql数据库磁盘io高的排查
查看>>
mysql数据库root密码忘记,查看或修改的解决方法
查看>>
MySQL数据库SQL注入靶场sqli通关实战(附靶场安装包)
查看>>
MYSQL数据库下载安装(Windows版本)
查看>>
MySQL数据库与Informix:能否创建同名表?
查看>>
mysql数据库中的数据如何加密呢?mysql8.0自带新特性
查看>>
MySQL数据库优化
查看>>
MySQL数据库优化总结
查看>>
Mysql数据库函数contac_函数:函数删除操作语法&使用例——《mysql 从入门到内卷再到入土》...
查看>>
mysql数据库命令备份还原
查看>>
mysql数据库基础教程
查看>>
MySQL数据库备份
查看>>
mysql数据库备份与恢复
查看>>
MySQL数据库备份实战
查看>>
Mysql数据库备份的问题:mysqldump: Got error: 1049: Unknown_无需整理
查看>>
mysql数据库如何重置密码是多少钱_MySQL数据库忘记root密码如何重置修改
查看>>
MySQL数据库安装配置与常用命令
查看>>
MySQL数据库实现主从同步数据
查看>>