1. 程式人生 > >Android一個APK多個入口(多個桌面圖示)的實現

Android一個APK多個入口(多個桌面圖示)的實現

前言
        Android應用一般都是一個APK一個桌面圖示,但有時候我們需要實現一個APK在桌面上有多個圖示(比如BAT的某些應用,有桌面快捷方式),對於這種一個APK需要在桌面上顯示多個圖示的,通常有兩種方法來實現:

1. 進入程式後生成桌面快捷方式,這個適合於在程式執行之後生成桌面圖示;

2. 在AndroidManifest.xml檔案中配置多個入口,這個適合於程式安裝完成後就在桌面上顯示多個圖示。

        在桌面生成快捷方式,具體實現方式可參見:

1. 總結:android 建立快捷方式的兩種方式+判斷是否已經建立+刪除快捷方式

2. Android create shortcuts on the home screen


        本文介紹第二種方式,在程式安裝完成後就會在桌面顯示多個圖示,這種方式適合於多個模組功能一樣,但裡面內容不一樣(比如教材資料)的情況。
具體實現

        在Android應用程式中,我們是通過給Activity標籤中加入下面的intent-filter來指定程式的入口的,如果一個APK要有多個入口,自然而然地想到AndroidManifest.xml檔案中會存在多個包含如下標籤的Activity,所以我們需要做的僅僅是如何區分每一個桌面圖示對應哪一個入口。

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
        Activity有一個重要的屬性process,這個屬性是指定Activity執行時所在的程序。沒有指定此屬性的話,所有程式元件執行在應用程式預設的程序中,這個程序名跟應用程式的包名一致。在AndroidManifest.xml檔案中所有元件元素的process屬效能夠為該元件設定一個新的預設值。但是任何元件都可以覆蓋這個預設值,允許你將你的程式放在多程序中執行。如果這個屬性被分配的名字以:開頭, 當這個Activity執行時, 一個新的專屬於這個程式的程序將會被建立。所以可以通過給每一個Activity指定標籤、圖示和程序名來區分不同的入口,具體實現如下:
         <activity
            android:name=".PreSchoolChildActivity"
            android:label="@string/pre_school_child_app_name"
            android:process=":process.main"
            android:icon="@drawable/preschoolchild_launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity
            android:name=".EnglishSpellActivity"
            android:label="@string/english_spell_app_name"
            android:process=":process.sub"
            android:launchMode ="singleInstance"
            android:icon="@drawable/englishspell_launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        需要注意的是,為Activity指定process屬性後,還必須為其指定launchMode為singleInstance,這樣才有效。除了為Activity指定android:process屬性外,還可以通過為Activity指定別名的方式實現同樣的效果,具體參見:activity-alias

存在的問題

1. 因為多個圖示共用一個包名,所以只要解除安裝一個程式,與這個APK包名相同的程式也都會在桌面上消失;

2. 從其它應用跳轉到該APK時,需要通過ACTION區分跳轉到具體哪一個模組(比如從資源管理器選擇一個數據時,到底開啟哪一個應用,需要通過action加以區分);

3. 由於多個圖示、splash、標題等需要區分的資源都放在一個APK中,這無形之中增加了APK的大小。