原文:http://blog.csdn.net/smileiam/article/details/70195915 看看這樣做能成功嗎?我還在調試!
Android開發三年了,今天才知道,可以給一個應用設置多個應用圖標(啓動圖標),可以在程序中動態更換應用圖標,作爲一枚有三年工作經驗的程序猿,今天才知道這事,被嚴重鄙視了。
下面就來說說如何給一個應用設置多個應用圖標?
1. 如何給一個應用設置多個入口,在launcher桌面上存在多個啓動圖標?
我們知道,設置一個應用的入口Activity,只需要在AndroidMainfest.xml文件中,在註冊activity的節點下添加intent-filter,並設置action屬性爲acion.MAIN, category屬性爲category.LAUNCHER,應用就會將此activity作爲應用程序的入口。
<activity android:name=".TestInputActivity"
android:windowSoftInputMode="adjustResize"
android:icon="@mipmap/f_homepage_affari_notice_icon"
android:label="TestInputActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
這樣該Activity就爲應用程序的入口Activity,點擊應用圖標首次進入的界面。
在該activity標籤下可以設置android:icon作爲應用的圖標, 設置android:label作爲應用名稱,如果沒有設置啓動Activity的icon和label屬性,會默認使用application節點下icon和label屬性中設置的應用圖標和應用名稱。
如果一個應用設置多個Activity的intent-filter屬性下的action爲action.MAIN, category屬性爲category.LAUNCHER,則應用就會在launcher的生成多個應用圖標,每個應用名稱分別是我們在activity標籤下定義的Activity的android:label的值。
使用場景:我們的Android手機一般在launcher上存在聯繫人應用圖標、撥號應用圖標,其實這兩個應用圖標對應的是同一個應用,只是設置了兩個入口,進入不同的Tab頁面。
2. 如何動態給應用更換圖標
比如我們過春節時,會發現微博或是淘寶等應用會更換應用圖標,如何在應用不重新發包的情況下,對應用圖標進行更換呢?
我們可以通過以下兩種方法來實現,其實原理是類似的。
2.1 方法一:根據開啓或關閉組件進行更換應用圖標
我們可以事先在AndroidMainfest.xml文件中定義多個應用的入口組件(啓動圖標),在代碼運行時控制組件的顯示與隱藏,從而達到更換應用圖標目的。由於在每年春節或是雙11時,一些商家可能需要列換應用圖標,我們可以在程序中通過時間來控制應用圖標更換目的。那如何控制組件的顯示與隱藏呢。
在講解更換應用圖標之前,我們先來了解下Android中如何禁用一個組件。
2.1.1 如何關閉一個組件?
(1)關閉組件的使用場景
在用到組件時,有時候我們可能暫時性的不使用組件,但又不想把組件kill掉,比如創建了一個broadcastReceiver廣播監聽器,用來監聽第一次開機啓動後獲得系統的許多相關信息,並保存在文件中,這樣以後每次開機啓動就不需要再去啓動該服務了,也就是說如果沒有把receiver關閉掉,就算是不做數據處理,但程序卻還一直在後臺運行會消耗電量和內存,這時候就需要把這個receiver給關閉掉。
(2)如何關閉組件?
關閉組件其實並不難,只要創建packageManager對象和ComponentName對象,並調用packageManager對象的setComponentEnabledSetting方法。
public void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
- 1
- 1
componentName:組件名稱
newState:組件新的狀態,可以設置三個值,分別是如下:
- 不可用狀態:COMPONENT_ENABLED_STATE_DISABLED
- 可用狀態:COMPONENT_ENABLED_STATE_ENABLED
- 默認狀態:COMPONENT_ENABLED_STATE_DEFAULT
flags:行爲標籤,值可以是DONT_KILL_APP或者0。 0說明殺死包含該組件的app
public int getComponentEnabledSetting(ComponentName componentName)//獲取組件的狀態
- 1
- 1
2.1.2 通過關閉組件或是開啓組件來達到應用圖標列換目的
通過下面的方法,通過設置組件的狀態,我們可以達到隱藏或是顯示一個應用圖標,從而達到更換應用圖標的目的。
private void hideTest2() {
PackageManager packageManager = getPackageManager();
ComponentName componentName = new ComponentName(this, Test2Activtiy.class);
int res = packageManager.getComponentEnabledSetting(componentName);
if (res == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|| res == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
// 隱藏應用圖標
packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
} else {
// 顯示應用圖標
packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
PackageManager.DONT_KILL_APP);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.2 方法二:根據activity-alias來設置桌面可以存在多個icon,再設置某個activity-alias顯示其他隱藏
2.2.1 在xml添加多個activity-alias、刪除應用首次進入activity標籤的category屬性
<activity-alias
android:name=".icon_tag"
android:enabled="true"
android:icon="your icon"
android:label="your label"
android:targetActivity=".activity.WeChatLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name=".icon_tag_1212"
android:enabled="false"
android:icon="your icon"
android:label="your label"
android:targetActivity=".activity.WeChatLoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
2.2.2 在代碼中控制活動和普通圖標的切換
/**
* @param useCode =1、爲活動圖標 =2 爲用普通圖標 =3、不啓用判斷
*/
private void switchIcon(int useCode) {
try {
//要跟manifest的activity-alias 的name保持一致
String icon_tag = "com.weechan.shidexianapp.icon_tag";
String icon_tag_1212 = "com.weechan.shidexianapp.icon_tag_1212";
if (useCode != 3) {
PackageManager pm = getPackageManager();
ComponentName normalComponentName = new ComponentName(
getBaseContext(),
icon_tag);
//正常圖標新狀態
int normalNewState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
if (pm.getComponentEnabledSetting(normalComponentName) != normalNewState) {//新狀態跟當前狀態不一樣才執行
pm.setComponentEnabledSetting(
normalComponentName,
normalNewState,
PackageManager.DONT_KILL_APP);
}
ComponentName actComponentName = new ComponentName(
getBaseContext(),
icon_tag_1212);
//正常圖標新狀態
int actNewState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
if (pm.getComponentEnabledSetting(actComponentName) != actNewState) {//新狀態跟當前狀態不一樣才執行
pm.setComponentEnabledSetting(
actComponentName,
actNewState,
PackageManager.DONT_KILL_APP);
}
}
} catch (Exception e) {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
**總結:給應用設置多個啓動圖標,並不是什麼難的知識點,但咱們平時都沒有關注過,有時覺得還有點不可思議,不自覺想起毛主席的那句話“一切困難都是紙老虎”,哈哈。
還有如何關閉一個組件,通過packageManager對象的setComponentEnabledSetting方法設置ComponentStatus狀態即可,通過它就可以動態更換應用圖標。
當然以下兩種方法都需要咱們先預先在應用的AndroidMainfest.xml中設置好相應的標籤,設置啓動模式,設置相應的圖標。如果想要應用動態換成任意圖標,則還是需要升級應用。