博客
关于我
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 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 备份 Xtrabackup
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>