动态更新桌面图标

前言:每当临近双十一,手机里一些购物的APP桌面logo都在无感知情况下换成了活动主题logo。

方案:(1)热更新(2)使用Activity-alias,本文主要介绍该方式

实现:

1、AndroidManifest.xml中添加activity-alias

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity-alias
        android:name="com.lpf.demo.MainActivity.One"
        android:enabled="false"
        android:icon="@mipmap/icon_one"
        android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>
    <activity-alias
        android:name="com.lpf.demo.MainActivity.Two"
            android:enabled="false"
            android:icon="@mipmap/icon_two"
            android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

    <activity-alias
        android:name="com.lpf.demo.MainActivity.Three"
            android:enabled="false"
            android:icon="@mipmap/icon_three"
            android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>
</application>

(1)acitvity-alias标签name命名:包名+任意唯一字符

(2)对于启动activity或acitvity-alias标签enabled只能有一个为true,否则桌面图标不只一个

(3)acitvity-alias标签targetActivity指向要启动的activity,可省略包名

2、切换桌面图标

class MainActivity : Activity() {
    val mComponentNameList = mutableListOf<ComponentName>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mComponentNameList.add(ComponentName(application, "com.lpf.demo.MainActivity"))//activity全路径
        mComponentNameList.add(ComponentName(application, "com.lpf.demo.MainActivity.One"))//activity-alias标签name
        mComponentNameList.add(ComponentName(application, "com.lpf.demo.MainActivity.Two"))
		mComponentNameList.add(ComponentName(application, "com.lpf.demo.MainActivity.Three"))

        buttonDef.setOnClickListener {
            setComponentState(0)//默认图标
        }

        buttonOne.setOnClickListener {
            setComponentState(1)//图标一	
        }

        buttonTwo.setOnClickListener {
            setComponentState(2)//图标二
        }
		
		buttonThree.setOnClickListener {
            setComponentState(3)//图标三
        }
    }

    private fun setComponentState(index: Int) {
        for (i in mComponentNameList.indices) {
            val state = packageManager.getComponentEnabledSetting(mComponentNameList[i])
            if (i == index) {
                if (state != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
                    packageManager.setComponentEnabledSetting(
                        mComponentNameList[i],
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                        PackageManager.DONT_KILL_APP
                    )
                }
                mComponentNameList[i]
            } else {
                if (state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED){
                    packageManager.setComponentEnabledSetting(
                        mComponentNameList[i],
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP
                    )
                }
            }
        }
    }
}

注:

(1)切换图标非及时生效,大概需要10秒左右桌面图标才刷新

(2)步骤二中切换为图标二,升级新版本覆盖安装后仍然为图标二而非默认的图标

(3)不要更改AndroidManifest中默认图标规则,切换图标要通过步骤二方式进行更改,否则可能会导致出现两个图标或无图标(如通过步骤二切换为图标二,新版本将AndroidManifest默认显示改为图标三,则覆盖安装后会同时出现图标二和图标三;另外如果当前默认为图标三且没有进行动态更改,新版本将AndroidManifest默认显示改为图标二,同时删除了图标三的activity-alias,则桌面无该APP图标)

猜你喜欢

转载自blog.csdn.net/yufumatou/article/details/109356332