前言:每当临近双十一,手机里一些购物的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图标)