Android动态修改桌面logo和名称activity-alias的使用

Android动态修改桌面图标和应用名称activity-alias的使用(如淘宝双十一)

转载注明出处,CSDN第一篇

11月进入新公司,主要对过去的项目进行优化,优化的过程中发现该项目有两个图标,一个普通的,一个带双十一的,想想即将到来的购物狂欢节,我觉得就稍微研究一下动态更换图标和应用名。
当然我的研究是搜搜搜,啊哈哈,不过还是记录一下自己的心得。

AndroidManifest中添加activity-alias配置

先上代码,看着代码来说明:

		<activity-alias
            android:name=".WelcomeActivityNormal"
            android:enabled="true"
            android:icon="@mipmap/ic_launcher"
            android:theme="@style/Logo"//此行可删
            android:exported="true"
            android:label="@string/app_name"
            android:targetActivity=".WelcomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

activity-alias是Activity的一个便签,用来重复使用Activity。
在AndroidManifest中加入上面这些,编译后就会生成WelcomeActivityNormal这个Activity,指向被targetActivity标记的WelcomeActivity,不需要去创建这个文件,我刚开始不明白,遇到提示找不到WelcomeActivityNormal,还创建了好几个。
android.intent.action.MAIN 代表应用打开最先显示
android.intent.category.LAUNCHER 代表允许被启动器调用
enabled设置为ture 代表用它做入口,每多一个enabled="true"就会多一个入口,就代表桌面上多一个图标。
exported设置为true代表可以被唤醒调用,这个和当前问题无关。
icon是图标,label是应用名,theme是自定义的主题,这就不多说了。

下面贴上AndroidManifest中的关键代码:这里要注意enabled只设置一个为true

 		<activity
            android:name=".WelcomeActivity"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity-alias
            android:name=".WelcomeActivityNormal"
            android:enabled="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:targetActivity="WelcomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>
        <activity-alias
            android:name=".WelcomeActivity11"
            android:enabled="false"
            android:icon="@mipmap/ic_launcher11"
            android:label="@string/app_name11"
            android:targetActivity="WelcomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

Activity中PackageManager的使用

PackageManager看名字都知道包管理,其中的setComponentEnabledSetting就是动态操作组件的,优先级高于AndroidManifest,操作后会覆盖AndroidManifest中的配置。
先上代码,边看边说:

 	private PackageManager mPackageManager;
     @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         //获取到包管理类实例
        mPackageManager = getPackageManager();
		long millis = System.currentTimeMillis();
        int month = DateTimeUtil.getSomething(millis + "", Calendar.MONTH);
        int day = DateTimeUtil.getSomething(millis + "", Calendar.DAY_OF_MONTH);
        ComponentName IndexActivityNormal = new ComponentName(getBaseContext(), "com.example.test.WelcomeActivityNormal");
        ComponentName IndexActivity11 = new ComponentName(getBaseContext(), "com.example.test.WelcomeActivity11");
        if (month == 11 && day == 11) {
            enableComponent(IndexActivity11);
            disableComponent(IndexActivityNormal);
        } else {
            enableComponent(IndexActivityNormal);
            disableComponent(IndexActivity11);
        }
    }
     /**
     * 启动组件
     * @param componentName 组件名
     */
    private void enableComponent(ComponentName componentName) {
        //此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性
        mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    }

    /**
     * 禁用组件
     * @param componentName 组件名
     */
    private void disableComponent(ComponentName componentName) {
        mPackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }

这里我的做法是获取当前日期,如果是11月11日,就显示双十一的图标。
貌似贴完代码没有什么需要说明的了,可以理解为两个图标互相替换显示。

使用问题记录

1、桌面图标消失,disableComponent之后没有enableComponent另一个
2、桌面两个图标,写了两个enabled为true,或者以前有个enableComponent,覆盖安装后又加了一个新的enabled为true
3、覆盖安装提示找不到activity,当前图标和安装时的状态一样可以覆盖更新,举例,默认是双十一图标,因为今天是12所以显示普通的,此时覆盖安装失败。写了个代码让其第二次打开换为双十一图标,可以覆盖安装,所以我建议默认的为普通,切正式版迭代不要凑到双十一那天,否则就是各种安装失败。
4、手机切换到后台找不到该应用,这个问题不知道如何解决。只查到android:excludeFromRecents="true"是让应用在后台看不到

借鉴

链接: [link]https://blog.csdn.net/nongminkouhao/article/details/84952295

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值