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

你可能感兴趣的文章
MSSQL数据库查询优化(一)
查看>>
MSSQL日期格式转换函数(使用CONVERT)
查看>>
MSTP多生成树协议(第二课)
查看>>
MSTP是什么?有哪些专有名词?
查看>>
Mstsc 远程桌面链接 And 网络映射
查看>>
Myeclipse常用快捷键
查看>>
MyEclipse用(JDBC)连接SQL出现的问题~
查看>>
myeclipse的新建severlet不见解决方法
查看>>
MyEclipse设置当前行背景颜色、选中单词前景色、背景色
查看>>
myeclipse配置springmvc教程
查看>>
MyEclipse配置SVN
查看>>
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
MySQL
查看>>
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>