### 二、Android中的多进程模式
#### 1、开启多进程模式
正常情况下,Android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程只有一种方法:就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定android:process属性。这个属性的值就是进程名。这意味着不能在运行时指定一个线程所在的进程。(其实还有一种方式,就是使用JNI在Native层去fork一个新的进程,这中方法属于特殊情况,也不是常用的创建多进程的方式)
关于进程的详细描述可参考[深入了解Android系统之进程](https://www.kancloud.cn/alex_wsc/androidsystem/403689)和[Android进程和线程](https://www.kancloud.cn/alex_wsc/android/431889)
可以在Eclipse的DDMS视图中查看进程信息,还可以用shell来查看当前所存在的进程信息,命令为:adb shell ps 或者 adb shell ps|grep 包名。
~~~
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:launchMode="standard" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process=":remote" />
<activity
android:name=".ThirdActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process="com.ryg.chapter_2.remote" />
~~~
上面的代码中,
(1)MainActivity没有指定process属性,所以它运行在默认的进程中,默认进程的进程名是包名。
(2)SecondActivity会运行在一个单独的进程中,进程名为“com.ryg.chapter_2:remote”,其中com.ryg.chapter_2是包名。在程序中的冒号“:”的含义是指要在当前的进程名前面附加上当前的包名,是一种简写的方法。而且以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID 方式可以和它跑在同一个进程中。
(3)ThirdActivity会运行在另一个单独的进程中,进程名为“com.ryg.chapter_2.remote”。这是一种完整的命名方式。属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中(需要这2个应用有相同的ShareUID且签名相同才可以)。
>[info] **注意点一**:Android系统会为每一个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。要求两个应用具有相同的ShareUID并且签名相同才可以跑在同一个进程中。在这种情况下,它们可以互相访问对方的私有数据,比如data目录、组件信息等,不管它们是否跑在同一个进程中。当然如果它们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据,或者说它们看起来就像是一个应用的两个部分。
#### 2、多进程模式的运行机制
(1)多进程会带来很多意想不到的麻烦,因为Android为每一个应用都分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。这样很就容易导致数据不同步。
(2)所有运行在不同进程的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。正常情况下,四大组件中间不可能不通过一些中间层来共享数据,那么简单的指定进程名来开启多进程都会无法正确的运行。当然,特殊情况下,某些组件之间不需要共享数据,这个时候可以指定android:progress来开启多进程,但是这种场景是不常见的,几乎所有的情况都需要共享数据。
(3)使用多进程会造成主要以下四方面的问题:
* 静态成员和单例模式完全失效。(由独立虚拟机造成)
* 线程同步机制完全失效。(同上)
* SharedPreferences的可靠性下降。(存在并发读写的问题)
* Application会多次创建。(新的进程中又会导致进程所在的Application在新的虚拟机中再次创建)
(4)运行在同一个进程中的组件是属于同一个虚拟机和同一个Application的,同理,运行在不同进程的组件是属于两个不同的虚拟机和Application的。
(5)多进程相当于两个不同的应用采用了SharedUID的模式
(6)实现跨进程的方式有很多:
1. Intent传递数据。
2. 共享文件和SharedPreferences。
3. 基于Binder的Messenger和AIDL。
4. Socket等
- 前言
- 第一章Activity的生命周期和启动模式
- 1.1 Activity生命周期全面分析
- 1.2 Activity的启动模式
- 1.3 IntentFilter的匹配规则
- 第二章IPC
- 转 chapter IPC
- 转IPC1
- 转IPC2
- Binder讲解
- binder
- Messenger
- 一、Android IPC简介
- 二、Android中的多进程模式
- 三、IPC基础概念介绍
- 四、Android中的IPC方式
- 五、Binder连接池
- 第三章
- 第九章四大组件的工作过程
- 第十章
- 第13章 综合技术
- 使用CrashHandler 来获取应用的crash 信息
- 使用Multidex来解决方法数越界
- Android的动态加载技术