前言
??Android應(yīng)用一般都是一個APK一個桌面圖標(biāo),但有時候我們需要實(shí)現(xiàn)一個APK在桌面上有多個圖標(biāo)(比如BAT的某些應(yīng)用,有桌面快捷方式),對于這種一個APK需要在桌面上顯示多個圖標(biāo)的,通常有兩種方法來實(shí)現(xiàn):
進(jìn)入程序后生成桌面快捷方式,這個適合于在程序運(yùn)行之后生成桌面圖標(biāo);
在AndroidManifest.xml文件中配置多個入口,這個適合于程序安裝完成后就在桌面上顯示多個圖標(biāo)。
??在桌面生成快捷方式,具體實(shí)現(xiàn)方式可參見:
??本文介紹第二種方式,在程序安裝完成后就會在桌面顯示多個圖標(biāo),這種方式適合于多個模塊功能一樣,但里面內(nèi)容不一樣(比如教材數(shù)據(jù))的情況。
具體實(shí)現(xiàn)
??在Android應(yīng)用程序中,我們是通過給Activity標(biāo)簽中加入下面的intent-filter來指定程序的入口的,如果一個APK要有多個入口,自然而然地想到AndroidManifest.xml文件中會存在多個包含如下標(biāo)簽的Activity,所以我們需要做的僅僅是如何區(qū)分每一個桌面圖標(biāo)對應(yīng)哪一個入口。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
??Activity有一個重要的屬性process,這個屬性是指定Activity運(yùn)行時所在的進(jìn)程。沒有指定此屬性的話,所有程序組件運(yùn)行在應(yīng)用程序默認(rèn)的進(jìn)程中,這個進(jìn)程名跟應(yīng)用程序的包名一致。在AndroidManifest.xml文件中所有組件元素的process屬性能夠?yàn)樵摻M件設(shè)定一個新的默認(rèn)值。但是任何組件都可以覆蓋這個默認(rèn)值,允許你將你的程序放在多進(jìn)程中運(yùn)行。如果這個屬性被分配的名字以:開頭, 當(dāng)這個Activity運(yùn)行時, 一個新的專屬于這個程序的進(jìn)程將會被創(chuàng)建。所以可以通過給每一個Activity指定標(biāo)簽、圖標(biāo)和進(jìn)程名來區(qū)分不同的入口,具體實(shí)現(xiàn)如下:
<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指定別名的方式實(shí)現(xiàn)同樣的效果,具體參見:activity-alias。
存在的問題
因?yàn)槎鄠€圖標(biāo)共用一個包名,所以只要卸載一個程序,與這個APK包名相同的程序也都會在桌面上消失;
從其它應(yīng)用跳轉(zhuǎn)到該APK時,需要通過ACTION區(qū)分跳轉(zhuǎn)到具體哪一個模塊(比如從資源管理器選擇一個數(shù)據(jù)時,到底打開哪一個應(yīng)用,需要通過action加以區(qū)分);
由于多個圖標(biāo)、splash、標(biāo)題等需要區(qū)分的資源都放在一個APK中,這無形之中增加了APK的大小。