Android應用設定多個啟動圖示,動態列換應用圖示

AND_YOU_with_ME發表於2017-04-17
說說如何給一個應用設定多個應用圖示

   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>

這樣該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)

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

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);
        }
    }

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>  

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) {  
    }  
}  

**總結:給應用設定多個啟動圖示,並不是什麼難的知識點,但我們們平時都沒有關注過,有時覺得還有點不可思議,不自覺想起毛主席的那句話“一切困難都是紙老虎”,哈哈。
還有如何關閉一個元件,通過packageManager物件的setComponentEnabledSetting方法設定ComponentStatus狀態即可,通過它就可以動態更換應用圖示。
當然以下兩種方法都需要我們們先預先在應用的AndroidMainfest.xml中設定好相應的標籤,設定啟動模式,設定相應的圖示。如果想要應用動態換成任意圖示,則還是需要升級應用。

相關文章