最近看到「医生」写的一篇文章: ,真是脑洞大开,没想到安卓应用的桌面图标还能动态改变,涨知识了,接触安卓开发以来还是第一次知道这玩意儿,顿感无地自容。于是细细读来,着手实践,对其中涉及到的知识点对着官方文档了解一番,总结记录于此。
每逢双十一购物节,你会发现手淘 App 的桌面图标会发生改变,当然应用里面的主题色调也会改变,变得非常喜庆,营造出一种节日的氛围,用户体验极好。既然存在这样的产品运营方式,那么如何从技术上实现呢?修改应用主题色调在这里就不谈了,常见的效果有黑白主题切换、主题包下载等,关于对应开发实现方式的讲解,网上相关资料很多。这里聊聊如何修改桌面图标,毕竟这个点涉及到的知识还是很少见的。
介绍
- <activity-alias>
- <activity-alias android:enabled=["true" | "false"]
- android:exported=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:permission="string"
- android:targetActivity="string" >
- . . .
- </activity-alias>
举例说明一下,Manafest 文件关键代码如下:
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="Samples"
- android:supportsRtl="true"
- android:name=".MyApplication"
- android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity-alias
- android:name=".MainAliasActivity"
- android:targetActivity=".MainActivity"
- android:label="Samples Alias"
- android:icon="@mipmap/ic_launcher_alias"
- android:enabled="false">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity-alias>
- </application>
表示这个别名设置是整个应用的入口,应用启动时第一个创建的就是这个 Activity;
- android.intent.action.MAIN
表示这个别名设置将出现在桌面 Launcher 应用上;
- android.intent.category.LAUNCHER
然后在 Activity 中动态切换,通过 PackageManager 对象提供的
方法关闭当前 Component 组件,并启动别名对应的 Component 组件即可,参考代码如下:
- setComponentEnabledSetting()
- public void onClickOne(View v){
- PackageManager pm = getPackageManager();
- pm.setComponentEnabledSetting(getComponentName(),
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
- pm.setComponentEnabledSetting(new ComponentName(this, "com.yifeng.samples.AliasName"),
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
- }
效果如图:
注意,修改之后,需要稍等片刻才能看到变化。如果想在修改完成之后立即看到变化,只能通过 Intent 重启 Launcher 应用。代码如下:
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_HOME);
- intent.addCategory(Intent.CATEGORY_DEFAULT);
- List<ResolveInfo> resolves = pm.queryIntentActivities(intent, 0);
- for (ResolveInfo res : resolves) {
- if (res.activityInfo != null) {
- ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- am.killBackgroundProcesses(res.activityInfo.packageName);
- }
- }
然后不要忘了在 Manifest 文件中添加权限:
- <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
通过这些设置,基本上就能实现动态修改应用的桌面图标和名称。通常,可以提前将新的图标放置在应用中,待到特定时间段通过服务器端的消息推送等行为灵活触发 App 修改 Launcher 上显示的图标和名称,这样就不必为了改个图标单独迭代一个新版本。值得注意的是,从产品角度上讲,一般不会为了短期的一个活动修改应用名称,而是只修改桌面图标,并且新的桌面图标也只是在原有的基础样式上动动手脚,起到锦上添花的作用,万不可改得面貌全非,否则会让用户产生误解,那就得不偿失了。
第一个,以上这种设置只能修改 Launcher 上的应用图标和名称,属于应用级别(application level)的,无法达到系统级别(OS level)的修改,比如改完之后,使用 menu 物理键打开 multi-task 窗口,或者打开设置查看应用列表,你会发现,对应应用的图标和名称还是显示之前默认的那些。不过,对于普通用户来说,主要还是在于桌面 Launcher 上的显示,毕竟这里才是最直观也是最常用到的地方。
来源: