美文网首页待写Android
动态更新桌面图标 icon

动态更新桌面图标 icon

作者: peterXpq | 来源:发表于2020-12-02 17:20 被阅读0次
每当双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的替换,用户无感知;

代码传送门 https://github.com/peterQin0826/AutoChangeIcon.git

相关文章

网友评论

    本文标题:动态更新桌面图标 icon

    本文链接:https://www.haomeiwen.com/subject/qjxuwktx.html