Android 动态更换App在Launcher里面的Icon

去年公司做活动的时候写的,居然忘记发出来了。

产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:不可以 产品:我们可以动态更换App在Launcher里面的Icon吗 开发:让我想想……

想法来自这里

首先利用activity-alias

   <activity
            android:name=".activity.SplashActivity"
            android:hardwareAccelerated="true"
            android:screenOrientation="portrait"
            android:theme="@style/AppThemeTransparentBackground">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />
        </activity>

        <activity-alias
            android:name=".activity.Test11"
            android:enabled="false"
            android:icon="@drawable/ic_au"
            android:label="双11"
            android:targetActivity=".activity.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />
        </activity-alias>

        <activity-alias
            android:name=".activity.Test65"
            android:enabled="false"
            android:icon="@drawable/ic_sg"
            android:label="UAT(65eday)"
            android:targetActivity=".activity.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />
        </activity-alias>

  • activity-alias,即activity的别名
  • name,即别名的名称
  • enabled,即是否可用,默认 false 否则我们 app 会有多个入口
  • icon,需要再在桌面显示的图片,即launcher icon
  • lable,app 的名称。比如可用改成 ezbuy(65eday)
  • targetActivity,即是哪个 activity 的别名。这里是我们的 launcher activity,
  • 其余的照搬

利用PackageManager.setComponentEnabledSetting PackageManager是一个大统领类,可以管理所有的系统组件,当然,如果Root了,你还可以管理其它App的所有组件,一些系统优化工具就是通过这个方式来禁用一些后台Service的。

使用方式异常简单:


    private void enableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }

    private void disableComponent(ComponentName componentName) {
        mPm.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
}

根据PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用.

然后调用方法就可以了

 private void initLauncherIcon() {
        ComponentName mDefault =getComponentName();
        ComponentName mEday11 = new ComponentName(
                getBaseContext(),
                "com.xx.xx.activity.Test11");
        ComponentName mEday65 = new ComponentName(
                getBaseContext(),
                "com.xx.xx.activity.Test65");
        mPm = getApplicationContext().getPackageManager();
        changeIcon65(mDefault, mEday65);
    }

    public void changeIcon65(ComponentName disable, ComponentName enable) {
        disableComponent(disable);
        enableComponent(enable);
    }

但是这边会有问题,如果你换了图标以后的话,app 是退出。 所以我们在用户退出我们 app 的时候去调用这段代码就行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。