Android應用設置多個啓動圖標,動態列換應用圖標

原文: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中設置好相應的標籤,設置啓動模式,設置相應的圖標。如果想要應用動態換成任意圖標,則還是需要升級應用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章