Android開發(fā)動態(tài)更換桌面app圖標

一開始我以為可以用網絡圖來顯示的,發(fā)現(xiàn)不可以,或者說根本找不到相應的api。想想也是,加載網絡圖片,你得有網絡吧,難道沒網絡就不顯示了嘛?好吧你會說我在有網絡情況下,下載到本地。但存儲到本地需要讀寫權限吧。
就算存儲了,但如何拿它設置桌面的圖標呢,我想想是無解的,還是得走AndroidManifest清單配置??偛荒苄薷淖烂鎙auncher這個桌面app吧

如果有人可以用網絡圖片來顯示桌面圖標,務必告訴我

好了,我們進入正題

一、思路

關鍵使用activity-alias,配置兩個相同activity,activity的屬性是繼承application的,也可以是重寫application的屬性,這很重要。希望你理解

二、實現(xiàn)代碼

配置代碼示例如下

<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

改變代碼如下

//動態(tài)改變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時調用

有問題請評論,私信我,每天都看簡書

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容