前言
之前的学习中,我们有提到Android的IPC机制。但是在深入IPC机制之前,我们要先理解Android的多进程模式。
Android多进程
正常情况下,在Android中多进程是指一个应用存在多个进程的情况。
多进程模式的开启
使用Android多进程只有一种方法,通过给四大组件(Activity
、Service
、Receiver
、ContentProvider
)在AndroidMenifest
中指定android:process
属性,我们就可以轻易开启多进程模式。
多进程举例
<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
属性,并且它们的属性值不同,这意味着当前应用又增加了两个进程。同样入口的Activity是MAinActivity,我们没有为它指定process
属性,那么它就会运行在默认线程中,默认进程的进程名就是包名。
查看进程命令
我们除了可以通过DDMS视图中可以查看进程信息,我们还可以通过shell来查看,命令是:adb shell ps
或者adb shell ps|grep 包名
。
多进程的命名方式
我们上面的例子中两个Activity中的android:process
属性分别是:remote
和com.ryg.chapter_2.remote
,两种命名方式是有区别的。它们的区别是“:”的含义是指在当前进程名前面附上当前的包名,这是一个简写的方法。com.ryg.chapter_2.remote
,它是一种完整的命名方法,不会附加包名。
私有进程
进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
全局进程
进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一进程中。
多进程模式可能会出现的问题
开启多进程的方法很容易,如上面所说的那样。但是在实际使用的过程中开启多进程模式会产生很多问题。问题如下:
- 静态成员和单例模式完全失效;
- 线程同步机制完全失效;
- SharedPreferences的可靠性下降;
- Application会多次创建。