博客
关于我
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中的using
查看>>
MySQL中的关键字深入比较:UNION vs UNION ALL
查看>>
mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
查看>>
mysql中的字段如何选择合适的数据类型呢?
查看>>
MySQL中的字符集陷阱:为何避免使用UTF-8
查看>>
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>
Mysql中索引的最左前缀原则图文剖析(全)
查看>>
MySql中给视图添加注释怎么添加_默认不支持_可以这样取巧---MySql工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>
Mysql中视图的使用以及常见运算符的使用示例和优先级
查看>>
Mysql中触发器的使用示例
查看>>
Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
查看>>
mysql中还有窗口函数?这是什么东西?
查看>>
mysql中间件
查看>>
MYSQL中频繁的乱码问题终极解决
查看>>