一開始我以為可以用網絡圖來顯示的,發(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時調用
有問題請評論,私信我,每天都看簡書