一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限、SDk版Activity、Service信息等。通常而言,这个文件中会有且仅有一个application节点,这个节点表示这是一个应用程序,无论它下面还有多少子节点如Activity、Service等等。形象的说,就是这个项目生成的apk安装到Android设备后,应用程序列表中会出现一个ICON,这个ICON就是这个程序的执行入口了。 html
可是,某些状况下,咱们须要为咱们的apk设置多个执行入口,也就是安装后在应用程序列表中出现多个ICON图标,各个ICON是APP不一样模块的入口点,而且各个模块运行在不一样的进程中。 linux
可能这种需求不多见,但仍是有一个现实的例子:系统中的联系人和电话这两个程序。表面看来这是两个独立的应用程序,但实际上它们只是一个应用程序的两个执行入口而已,点击联系人图标就会进入联系人界面,点击电话图标就会进入拨号界面,这都是经过设置该项目下Activity的属性来实现的。 android
Activity有一个重要的属性process,这个属性是指定Activity运行时所在的进程。没有指定此属性的话,全部程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中全部组建元素的process属性可以为该组件设定一个新的默认值。可是任何组件均可以覆盖这个默认值,容许你将你的程序放在多进程中运行。若是这个属性被分配的名字以:开头, 当这个activity运行时, 一个新的专属于这个程序的进程将会被建立。 shell
如下面的代码为例,项目中有两个Activity,其中一个采用默认属性,另外一个为其指定process属性以及新的ICON,这样该项目安装到设备上以后能够发现多了两个应用程序图标,一个是应用程序默认的图标,点击后进入HelloWorldActivity;另外一个是手动指定的ICON,点击后进入NextPageActivity。这时使用adb shell查看进程能够发现,两个Activity是运行在不一样的进程中的。 app
AndroidManifest.xml的主要内容以下: 性能
- 1.<activity Android:name=".HelloWorldActivity"
- 2. Android:label="@string/app_name"
- 3. Android:process=":process.main">
- 4. <intent-filter>
- 5. <action Android:name="android.intent.action.MAIN" />
- 6. <category Android:name="android.intent.category.LAUNCHER" />
- 7. </intent-filter>
- 8.</activity>
- 9.
- 10.<activity Android:name="cn.ian.NextPageActivity"
- 11. Android:label="@string/nextpage"
- 12. Android:process=":process.sub"
- 13. Android:icon="@drawable/icon1"
- 14. Android:launchMode ="singleInstance">
- 15. <intent-filter>
- 16. <action Android:name="android.intent.action.MAIN" />
- 17. <category Android:name="android.intent.category.LAUNCHER" />
- 18. </intent-filter>
- 19.</activity>
经过上面的方式,为App的各个组件指定process和icon属性,便可以达到相似于一个apk中打包多个程序(模块)的目的。 spa
ps:要特别注意,为Activity指定process属性后,还必须为其指定launchMode为singleInstance,这样才有效 .net
方法二:使用activity-alias 设计
activity-alias是android里为了重复使用Activity而设计的。 code
当在Activity的onCreate()方法里,执行getIntent().getComponent().getClassName();获得的可能不是这个Activity的名字,有多是别名的名字,例如:在AndroidMenifest.xml有以下配置:
这个应用会在桌面上建两个进入点,即建两个能够进入TestAndroid这个Activity的快捷图标。这时getIntent().getComponent().getClassName() 获得的名字就不同,一个是com.test.TestAndroid,一个是com.test.TestAndroidAlias。