美文网首页
Android动态更换图标,无感知

Android动态更换图标,无感知

作者: 带带我 | 来源:发表于2023-06-19 14:12 被阅读0次
本案例采用设置多个activity-alias的方式,要求内置好需要更换的图标

1、AndroidManifest文件添加activity-alias 基操,网上搜

<application
......
    <!--设置启动模式为singleInstance-->
    <activity android:name=".LauncherActivity" android:launchMode="singleInstance">
    <activity-alias
            android:name="NormalLauncherActivity"
            android:enabled="true"
            android:exported="true"
            android:icon="@mipmap/app_launcher_normal"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:targetActivity=".LauncherActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity-alias
            android:name="Festival38LauncherActivity"
            android:enabled="false"
            android:exported="true"
            android:icon="@mipmap/app_launcher_38"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:targetActivity=".LauncherActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity-alias
            android:name="Festival51LauncherActivity"
            android:enabled="false"
            android:exported="true"
            android:icon="@mipmap/app_launcher_51"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:targetActivity=".LauncherActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

2、切换

LauncherActivity为启动activity,在启动页中处理相关切换,重要的是将启动页启动模式设置为singleInstance,这样在执行切换时不会杀死其他任务栈的页面

  //通过服务器接口获取切换的参数,对比本地SharedPreferences记录的参数,如不一致,执行切换,在启动页跳转到主页时,在启动页的onDestroy中切换
   @Override
   protected void onDestroy() {
       //伪代码,服务器返回参数与本地不一致,需要切换
       if (!icon_serve.equals(icon_local)){
           disableLogo();
           enableLogo();
       }
       super.onDestroy();
   }
  //在页面执行 super.onDestroy();之前,切换icon,切换icon会杀掉任务栈的任务,
  //所以给LauncherActivity设置为singleInstance,如此只会杀掉LauncherActivity,其他启动的页面不受影响
  //这样并不会让应用退出,
  //enableLogo()方法如下:
  PackageManager pm = getPackageManager();
  //  假如需要切换到Festival38LauncherActivity
  ComponentName componentName = new ComponentName(this, getPackageName() + ".Festival38LauncherActivity");
  pm.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);
  //disableLogo()方法如下:
  PackageManager pm = getPackageManager();
  //当前需要设置disable的activity-alias的name
  ComponentName componentName = new ComponentName(this, getPackageName() + ".NormalLauncherActivity");
  pm.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);

3、总结
都是网上找来的方法,也有很多坑,大家多找找看看,大致就是不要随意更改已经添加的activity-alias,最好只增不减不改。本文主要是写切换icon不杀死应用,做到无感知切换的方案,大致就是执行enableLogo()和disableLogo()会使任务栈任务杀死,但我们只需要给启动页一个单独的任务栈singleInstance,只杀死此栈内任务,不影响应用其他任务栈,既可使应用正常运行,且完成icon切换,这种方式比“监测应用处于后台切换”要好,当应用处于后台被杀,也是会影响用户使用的撒

相关文章

网友评论

      本文标题:Android动态更换图标,无感知

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