每当双11或者节假日,安卓的桌面图标会更换成带有节日元素的 icon,今天一探究竟,如何实现的。
需要用到的知识:activity-alias
alias 英 [ˈeɪliəs] 美 [ˈeliəs, ˈeljəs]
n. 别名,化名;
顾名思义,activity-alias并不是代表一个Activity,而是代表一个已经存在的Activity的别名。
它使用在清单文件中,类似Activity标签。它可用来设置某个Activity的快捷入口
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>
-
属性说明
属性表
代码示例
<activity-alias
android:name=".ui.jingdong618"
android:enabled="false"
android:icon="@mipmap/normal_listner"
android:label="切换名称1"
android:targetActivity=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
- activity-alias 可以预存多个,然后根据条件去替换对应的icon,及设置桌面app 名称
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- - - -在Activity 中:
// 声明 要替换的别名
String currentString = "com.qhpc.fangzhou.ui.jingdong618";
// 替换方法
public void changeIcon(String activityPath) {
PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(this, activityPath),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
//重启桌面 加速显示
// restartSystemLauncher(pm);
}
public void restartSystemLauncher(PackageManager pm) {
ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
i.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> resolves = pm.queryIntentActivities(i, 0);
for (ResolveInfo res : resolves) {
if (res.activityInfo != null) {
am.killBackgroundProcesses(res.activityInfo.packageName);
}
}
}
@Override
protected void onDestroy() {
changeIcon();
super.onDestroy();
}
说明:
- 我们依赖后端接口告知我们需要替换桌面icon了,这时候,我们将预先放置的icon 对应的别名 currentString 赋值,然后存在本地(sharePreference )存储,为空才去替换, 放在启动页的onDestroy 方法中去替换是考虑到,这样替换的话跟随用户手动退出操作就做了桌面icon的替换,用户无感知;
网友评论