在Android開發(fā)中宇色,通常會有這樣的需求弱匪,逢年過節(jié)UI的小伙伴們都會做出節(jié)日或活動相關的APP圖標讓我們更換,可是每次更換都要發(fā)版實現(xiàn)李滴。那么购撼,如何在不發(fā)版的情況下動態(tài)地更換我們的圖標呢榨惰?本篇文章就來講講動態(tài)更換的方法凶赁。
原理:在Manifest文件中颅拦,使用<activity-alias>標簽為我們的啟動Activity準備多個別名缕坎,擁有<activity-alias>標簽的activity指向啟動Activity怖侦,每個擁有<activity-alias>標簽的Activity都可以單獨設置一個icon,在程序中我們動態(tài)設置<activity>和<activity-alias>的enabled屬性來實現(xiàn)替換圖標效果谜叹。
步驟:
- 在AndroidManifest.xml中添加<activity-alias>標簽匾寝,代碼如下所示:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity-alias
android:name="RoundActivity"
android:enabled="false"
android:icon="@mipmap/ic_launcher_round"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
</application>
這個<activity-alias>標簽需要注意的地方如下:
(1)android:name屬性可以隨意起。
(2)android:enabled屬性要設為false荷腊,否則桌面會存在多個APP圖標艳悔。
(3)android:icon屬性設置為不同的圖標。
(4)android:targetActivity屬性要設為啟動的Activity女仰。
(5)添加<intent-filter>那部分來使其作為啟動的Activity猜年。
- 我們在布局文件中創(chuàng)建兩個按鈕,用來切換不同的圖標疾忍,代碼如下:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_round_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="切換圓形圖標"/>
<Button
android:id="@+id/btn_primitive_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="切換原始圖標"/>
</LinearLayout>
- 在Java代碼中切換<activity>和<activity-alias>的使能狀態(tài)乔外,代碼如下:
private void setRoundIcon() {
PackageManager packageManager = getPackageManager();
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
".MainActivity"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager
.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
".RoundActivity"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager
.DONT_KILL_APP);
}
private void setPrimitiveIcon() {
PackageManager packageManager = getPackageManager();
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
".RoundActivity"), PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(new ComponentName(this, getPackageName() +
".MainActivity"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager
.DONT_KILL_APP);
}
注意setComponentEnabledSetting()方法的第3個參數(shù)有兩個值供選擇:1(也就是PackageManager.DONT_KILL_APP)和0。這兩種參數(shù)對應兩種效果:當設為1時一罩,當切換APP圖標時杨幼,會有幾秒鐘的延遲,并且在延遲期間不能點擊圖標進入APP;當設為0時差购,當切換APP圖標時四瘫,會立刻更換,但是應用會被強制退出并被清理掉欲逃。
存在的問題:
- 當啟動的<activity>的enabled屬性設為disabled時找蜜,Android Studio再次編譯運行會出現(xiàn)如下錯誤:
需要將<activity>的enabled屬性設為enabled或者將APP卸載后才能編譯運行。
- 在應用管理和應用詳情頁里App的圖標一直是原來的稳析,不會動態(tài)修改锹杈。