文章时间久远,仅做参考。
公司APP最近做活动(12.12)要换APP图标,产品说活动前上一个版,放12.12的icon,等活动过了再更新一个版,换成平常的图标。
顿时我就生气了,淘宝京东都可以动态换icon,直接让我写死?
这不是对技术的蔑视吗?埋头研究动态换icon,准备写成功后摔产品脸上。
哈哈哈yy的题外话。不过产品是让我写死,我就自己去研究动态换。
下面开始正题、百度了下了解android可以根据activity-alias来设置桌面可以存在多个icon,那直接通过设置某个activity-alias显示其他隐藏即可实现。下面上代码
1、在xml添加多个activity-alias、删除mainActivity标签的<categoryandroid:name="android.intent.category.LAUNCHER" />属性
<activity-alias
android:name=".icon_tag"
android:enabled="true"
android:icon="your icon"
android:label="your icon"
android:targetActivity=".activity.WeChatLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name=".icon_tag_1212"
android:enabled="false"
android:icon="your icon"
android:label="your icon name"
android:targetActivity=".activity.WeChatLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
如上图 指向的targetActivity可以是不同的,这样启动的activity也是不是一样的,主要的是name要和代码中保持一致
2、代码中控制活动和普通图标的切换
/**
* @param useCode =1、为活动图标 =2 为用普通图标 =3、不启用判断
*/
private void switchIcon(int useCode) {
try {
//要跟manifest的activity-alias 的name保持一致
String icon_tag = "com.weechan.shidexianapp.icon_tag";
String icon_tag_1212 = "com.weechan.shidexianapp.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找不到,导致桌面无图标,应用打不开!!!此坑严重请注意