博客
关于我
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/

你可能感兴趣的文章
MUI框架里的ajax的三种方法
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
Mysql 8.0 新特性
查看>>
MultCloud – 支持数据互传的网盘管理
查看>>
MySQL 8.0.23中复制架构从节点自动故障转移
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>