簡介
最近遇到了這么個需求,動態(tài)改變桌面圖標(biāo),這個功能本身還是比較常見,比如天貓等app在各種剁手節(jié)的時候基本都會換個應(yīng)景的圖標(biāo)以及整體風(fēng)格,而這里只討論圖標(biāo)的更換,查閱了一些資料,這里就介紹一下我認為最便捷的方式。
原理
原理其實很簡單就是利用<activity-alias>標(biāo)簽,控制其enabled屬性,用來顯示與否。
實現(xiàn)
實現(xiàn)之前,先簡單描述一下需求:
App默認圖標(biāo)是Android機器人圖標(biāo),然后還有另外兩個圖標(biāo)icon_1和icon_2,通過按鈕點擊設(shè)置變成哪個圖標(biāo),也有一個還原圖標(biāo)的功能。
實現(xiàn)步驟:
- 增加對應(yīng)個數(shù)的<activity-alias>標(biāo)簽
- 增加布局喝對應(yīng)點擊事件
- 代碼控制顯示哪個圖標(biāo)
接下來就一步一步的來實現(xiàn):
1、增加對應(yīng)個數(shù)的<activity-alias>標(biāo)簽
這里還有兩個圖標(biāo),所以我們再增加兩個<activity-alias>標(biāo)簽,這個標(biāo)簽是在AndroidManifest.xml的<application>標(biāo)簽內(nèi)的,和<activity>標(biāo)簽同一級,其中一個代碼如下:
<activity-alias
android:name=".MainActivity1"
android:enabled="false"
android:icon="@mipmap/icon_1"
android:label="@string/app_name"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
這里需要注意一下他的這幾個屬性:
屬性 | 含義 |
---|---|
name | 可任意取值,只要能保證是唯一標(biāo)識即可,為了方便管理建議有規(guī)律一些 |
targetActivity | 這個屬性的值就是代表指向的是哪個Activity,而這個標(biāo)簽本身代表是該Activity的別名,記得指向的Activity要在該標(biāo)簽之前申明,否則可能運行不起來 |
icon | 指的是該別名對應(yīng)的應(yīng)用圖標(biāo) |
label | 指的是該別名對應(yīng)的應(yīng)用名字 |
enabled | 默認是true,true就會顯示在桌面上,這里為了保證桌面只顯示一個圖標(biāo),則<activity-alias>中的屬性都是false,而在之后代碼中動態(tài)控制這個屬性,來顯示和隱藏對應(yīng)的圖標(biāo) |
至于<intent-filter>,這個和Activity的沒有區(qū)別,其實完全可以把<activity-alias>當(dāng)作Activity組件來看,只是不是真身,是別名罷了。
另一個也是同理的,這里就不介紹了。
2、增加布局和對應(yīng)點擊事件
這一點其實沒啥好說的,布局就是一個豎直方向的LinearLayout,里邊有三個Button,通過其onClick屬性,設(shè)置點擊相應(yīng)的方法,當(dāng)然你也可以獲取到這些Button再設(shè)置OnClickListener,代碼比較簡單,文末有Demo地址。
3、代碼控制顯示哪個圖標(biāo)
這一步其實也就是調(diào)用PackageManager中的一個方法即可,方法如下:
private void changeLauncher(String name) {
PackageManager pm = getPackageManager();
//隱藏之前顯示的桌面組件
pm.setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
//顯示新的桌面組件
pm.setComponentEnabledSetting(new ComponentName(MainActivity.this, name),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
都是調(diào)用PackageManager的setComponentEnabledSetting方法,第一個參數(shù)表示操作的組件是哪個,第二個參數(shù)表示顯示還是隱藏,第三個組件表示是否關(guān)掉app。
TIPS
1、這里有個技巧,建議不要直接點了切換按鈕就去執(zhí)行切換圖標(biāo),因為執(zhí)行切換圖標(biāo)之后始終會關(guān)閉這次打開的app,所以我們 可以點擊之后先記錄下要換成哪個圖標(biāo),在程序退出的時候再切換圖標(biāo),這樣一來就不會關(guān)閉該app了。
2、細心的朋友會發(fā)現(xiàn),在調(diào)試階段,我改了這個app的啟動圖標(biāo),再執(zhí)行代碼啟動,發(fā)現(xiàn)啟動不了,其實這是因為代碼中默認啟動那個組件和修改后的那個組件不一致了,所以就啟動不了,而對于程序的更新和安裝是沒有影響的。
3、這種方式動態(tài)更換圖標(biāo),更換的時候不是,切換之后就馬上生效的,據(jù)我觀察應(yīng)該和手機性能有關(guān),在執(zhí)行該操作之后,會在幾秒鐘之內(nèi)改變圖標(biāo),但是對于普通桌面圖標(biāo)的改變,該缺點還是可以接受的,畢竟不是用戶手動觸發(fā),也不影響體驗。