Android开发学习Android开发

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>

注意点

改变代码如下

//动态改变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时调用

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

上一篇下一篇

猜你喜欢

热点阅读