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