Android开发动态更换桌面app图标

一开始我以为可以用网络图来显示的,发现不可以,或者说根本找不到相应的api。想想也是,加载网络图片,你得有网络吧,难道没网络就不显示了嘛?好吧你会说我在有网络情况下,下载到本地。但存储到本地需要读写权限吧。
就算存储了,但如何拿它设置桌面的图标呢,我想想是无解的,还是得走AndroidManifest清单配置。总不能修改桌面launcher这个桌面app吧

如果有人可以用网络图片来显示桌面图标,务必告诉我

好了,我们进入正题

一、思路

关键使用activity-alias,配置两个相同activity,activity的属性是继承application的,也可以是重写application的属性,这很重要。希望你理解

二、实现代码

配置代码示例如下


    
        
            
            
            
            
        
    
    
        
            
            
            
            
        
    

注意点

  • 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

写了

坑2

调了会有类似闪退的效果,最好放在关闭App时调用

有问题请评论,私信我,每天都看

你可能感兴趣的:(Android开发动态更换桌面app图标)