首先先解决下实际问题。动态更换图标。android可以根据activity-alias来设置桌面可以存在多个icon,那直接通过设置某个activity-alias显示其他隐藏即可实现。下面上代码
在xml添加多个activity-alias、删除MainActivity标签的 属性。如上图 指向的targetActivity可以是不同的,这样启动的activity也是不是一样的,主要的是name要和代码中保持一致
2、代码中控制活动和普通图标的切换
/** * @param useCode =1、为活动图标 =2 为用普通图标 =3、不启用判断 */ private void switchIcon(int useCode) { try { //要跟manifest的activity-alias 的name保持一致 String icon_tag = "top.vchao.icon.icon_tag"; String icon_tag_1212 = "top.vchao.icon.icon_tag_1212"; if (useCode != 3) { PackageManager pm = getPackageManager(); ComponentName normalComponentName = new ComponentName( getBaseContext(), icon_tag); //正常图标新状态 int normalNewState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; if (pm.getComponentEnabledSetting(normalComponentName) != normalNewState) {//新状态跟当前状态不一样才执行 pm.setComponentEnabledSetting( normalComponentName, normalNewState, PackageManager.DONT_KILL_APP); } ComponentName actComponentName = new ComponentName( getBaseContext(), icon_tag_1212); //正常图标新状态 int actNewState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; if (pm.getComponentEnabledSetting(actComponentName) != actNewState) {//新状态跟当前状态不一样才执行 pm.setComponentEnabledSetting( actComponentName, actNewState, PackageManager.DONT_KILL_APP); } } } catch (Exception e) { } }上图的icon_tag和icon_tag_1212要和你xml中的activity-alias的name保持一致
补坑。。activity-alias的name是不能改的!! 如果当前版本的是icon_tag_1212,下版本改成icon_tag_act,就会导致系统找icon_tag_1212找不到,导致桌面无图标,应用打不开!!!此坑严重请注意
activity-alias标签元素实现了功能,下面就来看一下原理。所周知,AndroidManifest是一个xml文件,它包含很多标签元素,如application、activity、receiver等,其中有一个叫做activity-alias,因为该标签平时很少用到,可能大家对这个标签还不是很熟悉。
activity-alias,顾名思义,即activity的别名。看到这里,大家会想那它究竟是哪个Activity的别名呢?我们在创建一个Activity时,必须在AndroidManifest中静态