赞
踩
一.需求:
快过年了,产品经理给出这样一个需求:升级一个版本,把桌面icon改为新年主题的,年后再升级一个版本,改为默认的icon,我心里想,就为了一个icon,要升级两个版本,这也太low币了吧,于是,就想如何动态的实现这个功能。
二.思路:
安卓程序可以有多个入口,也就是,一个程序可以有多个icon图标点击进入程序。我们可以根据需求需要哪个icon,就让该入口
可以使用,让其他入口不可使用,那么,我们就只保留有含有我们需要的icon的启动图标了。
三.具体实现:
直接上代码:
<!-- 启动页面 -->
<activity
android:name=".ui.activity.SplashActivity"
android:screenOrientation="landscape"
android:theme="@style/SplashAppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--<category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
</activity>
<!--默认的-->
<activity-alias
android:name=".icon_default"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:targetActivity=".ui.activity.SplashActivity">
<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_newyear"
android:enabled="false"
android:icon="@mipmap/new_year_logo"
android:label="新年好"
android:targetActivity=".ui.activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
使用,activity-alias标签,每个代表一个程序入口,一个入口,但是,如果在activity标签下也配置为LANCHER的话,会有一点问题,所以我就将启动activity下的<category ......LAUNCHER
去掉了,如果去掉的话,则必须要保证两个activity-alias中至少有一个enable为true,也就是至少有一个是可用的,当然也可以有多个可用
那样的话,就会有多个入口,也就是在桌面上会有多个icon图标,当然没有特殊需求的话,我们只要一个入口就可以了。
public static int ICON_DEFAULT = 0;//默认图标;
public static int ICON_NEWYEAR = 1;//新年图标;
/**
* 切换启动图标:
*
* @param iconType 0: 为默认图标 1: 为新年图标
*/
public static void switchIcon(Context context, int iconType) {
try {
String icon_tag_default = context.getPackageName() + ".icon_default";
String icon_tag_newyear = context.getPackageName() + ".icon_newyear";
String[] icon_tags = new String[]{icon_tag_default, icon_tag_newyear};
int[] icon_types = new int[]{ICON_DEFAULT, ICON_NEWYEAR};
boolean isHaveIcon = false;
//判断是否包含该图标类型;
for (int i = 0; i < icon_types.length; i++) {
if (iconType == icon_types[i]) {
isHaveIcon = true;
}
}
PackageManager pm = context.getPackageManager();
//使用默认的:
if (!isHaveIcon) {
iconType = icon_types[0];
}
for (int i = 0; i < icon_tags.length; i++) {
ComponentName normalComponentName = new ComponentName(
context,
icon_tags[i]);
int normalNewState = (icon_types[i] == iconType) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
//新状态跟当前状态不一样才执行
if (pm.getComponentEnabledSetting(normalComponentName) != normalNewState) {
pm.setComponentEnabledSetting(
normalComponentName,
normalNewState,
PackageManager.DONT_KILL_APP);
}
}
} catch (Exception e) {
Log.e("TAG", e.getMessage());
}
}
以上代码为替换应用icon的方法,具体需要使用哪个icon,我们可以在后台配置,通过接口的方式获取到icon的类型,然后我们
根据icon的类型而去设置相应的icon。
四.遇到的问题:
①在使用过程中,会发现,比如:当应用启动后调用方法设置为新年的icon,而在清单配置文件中,我们配置的默认icon的alias为可以使用,新年
icon的alias为不可使用,我们通过Android studio启动代码程序,会无法运行,这是由于系统配置和程序发生了冲突,而如果卸掉或者
升级后就不会出现这种问题,我们在运行代码时候,可以把应用已经设置的icon对应的alias设置为true,另一个设置为false,这样就可以运行了。
②老版本中没有alias,在新版本中加入了alias,如果直接运行程序,会出现闪退,作为调试的话,只需将原来的程序卸载掉重装即可。
在正常的版本升级过程中,新版本会替换掉老版本,就不会出现以上问题。
综上,问题总是出现在使用Android studio运行程序代码时,在正常的版本迭代中并不会出现,可以放心使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。