正常情况下,在Android中多进程是指一个应用中存在多个进程的情况,因此这里我们暂不讨论两个应用之间的多进程情况.
开启多进程模式:
在Android中使用多进程只有一种方法,那就是在AndroidManifest中给四大组件(Activity,Service,Receiver,ContentProvider)指定android:process属性.除此之外没有其他的办法,也就是说我们无法给一个线程活一个实体类指定其运行时所在的进程.其实还有另一种非常规的多进程方法,那就是通过JNI在native层去fork一个新的进程,但这种方法属于特殊情况,并不是常用的创建多进程的方式,所以我们也暂不考虑这种情况.
下面列举一个示例描述如何在Android中创建多进程.
该示例分别为SecondActivity和ThirdActivity指定了process属性,并且它们的属性值不同,这意味当前应用又增加了两个新的进程.假设当前的应用的包名为”com.siqi.pisces”,当SecondActivity启动时,系统会为它创建一个单独的进程,进程名为”com.siqi.pisces:second”; 当ThirdActivity启动时,系统也会为他创建一个单独的进程,进程名为”com.siqi.pisces.third”;而同时应用的入口Activity是MainActivity,我们并没有为他指定process属性,那么它运行在默认进程中,默认进程的进程名是应用的包名.
运行程序后我们可以看见如上图所示,进程列表中的三个进程id分别为30211、30443、30486,这说明我们的应用成功的使用了多进程技术,那么我们可以发现开启Android应用的多进程模式是不是很简单呢?但这仅仅只是开始,实际的使用中还是会有很多问题需要处理的.
查看应用进程的方法:
可以在IDE的DDMS视图中直接查看进程信息,也可以使用命令行来进行查看,命令为:adb shell ps或者 adb shell ps | grep com.siqi.pisces.
其中”com.siqi.pisces”是应用的包名.
不知道大家有没有注意到,SecondActivity和ThirdActivity的android:process属性分别为”:second”和”com.siqi.pisces”,那么这两种方式有区别么?
其实是有区别的,区别有两方面:
首先,”:”的含义是指要在当前的进程名前面附加上当前的包名,这是一种简单的写法,对于SecondActivity来说,它的完整的进程名为”com.siqi.pisces:second”,这一点通过上图也能看出来,而对于ThirdActivity中的声明方式,它是一种完整的命名方式,不会附加包名信息;
其次,进程名以”:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以”:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中.
我们知道Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据.这里要说的是,两个应用用过ShareUID跑在同一个进程中是有要求的,需要这两个应用具有相同的ShareUID并且签名相同才可以.在这种情况下,它们可以互相访问对方的私有数据,比如data目录,组件信息等,不管它们是否跑在同一个进程中.当然,如果它们跑在同一个进程中,那么除了能共享data目录,组件信息,还可以共享内存数据等等,也可以简单的把它们想成一个应用的两个部分.