Android開發(fā)中,一個(gè)工程對應(yīng)一個(gè)AndroidManifest.xml文件,這個(gè)文件中包含有該項(xiàng)目的一些設(shè)置,如權(quán)限、SDk版Activity、Service信息等。一般而言,這個(gè)文件中會有且僅有一個(gè)application節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)表示這是一個(gè)應(yīng)用程序,不管它下面還有多少子節(jié)點(diǎn)如Activity、Service等等。形象的說,就是這個(gè)項(xiàng)目生成的apk安裝到Android設(shè)備后,應(yīng)用程序列表中會出現(xiàn)一個(gè)ICON,這個(gè)ICON就是這個(gè)程序的執(zhí)行入口了。
但是,某些情況下,我們需要為我們的apk設(shè)置多個(gè)執(zhí)行入口,也就是安裝后在應(yīng)用程序列表中出現(xiàn)多個(gè)ICON圖標(biāo),各個(gè)ICON是APP不同模塊的入口點(diǎn),并且各個(gè)模塊運(yùn)行在不同的進(jìn)程中。
可能這種需求很少見,但還是有一個(gè)現(xiàn)實(shí)的例子:系統(tǒng)中的聯(lián)系人和電話這兩個(gè)程序。表面看來這是兩個(gè)獨(dú)立的應(yīng)用程序,但實(shí)際上它們只是一個(gè)應(yīng)用程序的兩個(gè)執(zhí)行入口而已,點(diǎn)擊聯(lián)系人圖標(biāo)就會進(jìn)入聯(lián)系人界面,點(diǎn)擊電話圖標(biāo)就會進(jìn)入撥號界面,這都是通過設(shè)置該項(xiàng)目下Activity的屬性來實(shí)現(xiàn)的。
Activity有一個(gè)重要的屬性process,這個(gè)屬性是指定Activity運(yùn)行時(shí)所在的進(jìn)程。沒有指定此屬性的話,所有程序組件運(yùn)行在應(yīng)用程序默認(rèn)的進(jìn)程中,這個(gè)進(jìn)程名跟應(yīng)用程序的包名一致。
以下面的代碼為例,項(xiàng)目中有兩個(gè)Activity,其中一個(gè)采用默認(rèn)屬性,另一個(gè)為其指定process屬性以及新的ICON,這樣該項(xiàng)目安裝到設(shè)備上之后可以發(fā)現(xiàn)多了兩個(gè)應(yīng)用程序圖標(biāo),一個(gè)是應(yīng)用程序默認(rèn)的圖標(biāo),點(diǎn)擊后進(jìn)入HelloWorldActivity;另一個(gè)是手動(dòng)指定的ICON,點(diǎn)擊后進(jìn)入NextPageActivity。這時(shí)使用adb shell查看進(jìn)程可以發(fā)現(xiàn),兩個(gè)Activity是運(yùn)行在不同的進(jìn)程中的。
AndroidManifest.xml的主要內(nèi)容如下:
12345678910111213141516171819 | <activity android:name=".HelloWorldActivity" android:label="@string/app_name" android:process=":process.main"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity> <activity android:name="cn.ian.NextPageActivity" android:label="@string/nextpage" android:process=":process.sub" android:icon="@drawable/icon1" android:launchMode ="singleInstance"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity> |
通過上面的方式,為App的各個(gè)組件指定process和icon屬性,便能夠達(dá)到類似于一個(gè)apk中打包多個(gè)程序(模塊)的目的。
ps:要特別注意,為Activity指定process屬性后,還必須為其指定launchMode為singleInstance,這樣才有效。