企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 2.2.1 开启多进程模式 **正常情况下,在Android中多进程是指一个应用中存在多个进程的情况**,因此这里不讨论两个应用之间的多进程情况。**首先,在Android中使用多进程只有一种方法,那就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidMenifest中指定android:process属性,除此之外没有其他办法,也就是说我们无法给一个线程或者一个实体类指定其运行时所在的进程**。其实还有另一种非常规的多进程方法,那就是通过JNI在native层去fork一个新的进程,但是这种方法属于特殊情况,也不是常用的创建多进程的方式,因此我们暂时不考虑这种方式。下面是一个示例,描述了如何在Android中创建多进程: <activity android:name="com.ryg.chapter_2.MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity <activity android:name="com.ryg.chapter_2.SecondActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process=":remote" /> <activity android:name="com.ryg.chapter_2.ThirdActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process="com.ryg.chapter_2.remote" /> 上面的示例分别为SecondActivity和ThirdActivity指定了process属性,并且它们的属性值不同,这意味着当前应用又增加了两个新进程。 * 假设当前应用的包名为“com.ryg. chapter_2”,当SecondActivity启动时,系统会为它创建一个单独的进程,进程名为“com.ryg.chapter_2:remote”; * 当ThirdActivity启动时,系统也会为它创建一个单独的进程,进程名为“com.ryg.chapter_2.remote”。 * 同时入口Activity是MainActivity,没有为它指定process属性,那么它运行在默认进程中,默认进程的进程名是包名。 下面我们运行一下看看效果,如图2-1所示。**进程列表末尾存在3个进程,进程id分别为645、659、672**,这说明我们的应用成功地使用了多进程技术,是不是很简单呢?这只是开始,实际使用中多进程是有很多问题需要处理的。 :-: ![](https://img.kancloud.cn/f0/6f/f06f641333b506f3c5f5f074fca2055b_577x597.png) 图2-1 系统进程列表 除了在Eclipse的DDMS视图中查看进程信息,还可以用shell来查看,命令为:`adb shell ps`或者`adb shell ps | grep com.ryg.chapter_2`。其中com.ryg.chapter_2是包名,如图2-2所示,通过ps命令也可以查看一个包名中当前所存在的进程信息。 :-: ![](https://img.kancloud.cn/f6/9e/f69e9a912077aff8138a1f713e9cc072_1322x153.png) 图2-2 通过ps命令来查看进程信息 不知道读者朋友有没有注意到,SecondActivity和ThirdActivity的android:process属性分别为“`:remote`”和“`com.ryg.chapter_2.remote`”,那么这两种方式有区别吗? 其实是有区别的,区别有两方面: * 首先,“:”的含义是指要在当前的进程名前面附加上当前的包名,这是一种简写的方法,对于SecondActivity来说,它完整的进程名为`com.ryg.chapter_2:remote`,这一点通过图2-1和2-2中的进程信息也能看出来,而对于ThirdActivity中的声明方式,它是一种完整的命名方式,不会附加包名信息; * 其次,**进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中**。 我们知道**Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据**。这里要说明的是,**两个应用通过ShareUID跑在同一个进程中是有要求的,需要这两个应用有相同的ShareUID并且签名相同才可以。在这种情况下,它们可以互相访问对方的私有数据,比如data目录、组件信息等,不管它们是否跑在同一个进程中**。 当然*如果它们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据,或者说它们看起来就像是一个应用的两个部分*。