Android动态换桌面icon

一.需求:

 快过年了,产品经理给出这样一个需求:升级一个版本,把桌面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下配置的,<category ........LAUNCHER>也是

一个入口,但是,如果在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运行程序代码时,在正常的版本迭代中并不会出现,可以放心使用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值