Android开发动态更换桌面app图标
2021-01-09 本文已影响0人
你的益达233
一开始我以为可以用网络图来显示的,发现不可以,或者说根本找不到相应的api。想想也是,加载网络图片,你得有网络吧,难道没网络就不显示了嘛?好吧你会说我在有网络情况下,下载到本地。但存储到本地需要读写权限吧。
就算存储了,但如何拿它设置桌面的图标呢,我想想是无解的,还是得走AndroidManifest清单配置。总不能修改桌面launcher这个桌面app吧
如果有人可以用网络图片来显示桌面图标,务必告诉我
好了,我们进入正题
一、思路
关键使用activity-alias,配置两个相同activity,activity的属性是继承application的,也可以是重写application的属性,这很重要。希望你理解
二、实现代码
配置代码示例如下
<application
android:name=".base.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/icon_app"
android:label="@string/app_name"
android:roundIcon="@mipmap/icon_app"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
android:hardwareAccelerated="true"
tools:ignore="ExtraText,GoogleAppIndexingWarning">
<activity
android:name=".ui.login.StartPageActivity"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/AppStartTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity-alias
android:name="cqlauncher"
android:enabled="false"
android:icon="@mipmap/icon_share_qq"
android:roundIcon="@mipmap/icon_share_qq"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/AppStartTheme"
android:targetActivity=".ui.login.StartPageActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity-alias>
注意点
- activity-alias需要在activity下面,enabled为false,否则桌面会有两个图标
- activity-alias下的name随你起,但targetActivity需要是上面activity的name
- 在这配置你要换的icon和label
- android:exported都需要为true。默认为true
改变代码如下
//动态改变APP图标
private fun switchIcon(isChange: Boolean){
var name = "xxx.xxx.xxx.cqlauncher"
val pm = packageManager
if (isChange){
pm.setComponentEnabledSetting(ComponentName(this,"xxx.xxx.xxx.StartPageActivity"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
pm.setComponentEnabledSetting(ComponentName(this,name), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
} else {
pm.setComponentEnabledSetting(ComponentName(this,"xxx.xxx.xxx.StartPageActivity"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
pm.setComponentEnabledSetting(ComponentName(this,name), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
}
}
上面的xxx.xxx.xxx是你清单中的package。我被这name坑了好半天,一开始我写的是cqlauncher,和清单里面配置的name一样啊,为什么不行。可能它也要完整的路径
坑1
写了<activity-alias以后版本也需要,不能删除,可以不用。否则新版本替换安装可能连图标都找不到喔
坑2
调了会有类似闪退的效果,最好放在关闭App时调用
有问题请评论,私信我,每天都看简书