IPC(Inter-Process Communication),含义为进程间通信,也就是指两个进程之间进行数据交换的过程。
线程与进程的概念:
线程:CPU调度的最小单元
进程:一般指一个执行单元
二、开启多进程模式
这里的多进程模式讨论的是一个应用存在多个进程的情况;
应用开启多进程模式有两种方法:
第一种:只需在AndroidMenifest文件中为四大组件指定android:process属性
第二种:通过JNI在native层去fork一个新的进程
以第一种方法为例:
<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=".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" />
分析:
当前包名为“com.ryg.chapter_2”;
当SecondActivity启动时,会创建进程名为“com.ryg.chapter_2:remote”的进程;
当ThirdActivity启动时,会创建进程名为”com.ryg.chapter_2.remote“的进程;
同时入口MainActivity,没有为它指定process属性,则会运行在默认进程中,默认进程名为包名。
SecondActivity与ThirdActivity的进程名命名方式不同:前者是简写的命名方式,”:“的含义是指当前进程名前面附加上当前的包名;后者是完整的命名方式,不会附加包名信息。
开启多进程模式很简单,但是它会造成如下问题:
1、静态成员和单例模式失效
2、Application会多次创建
3、线程同步机制完全失效(这里指的是多进程间的线程同步)
4、SharedPreferences的可靠性下降
Android为每一个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,也就导致了同一类对象会有多份副本,所以运行在不同进程间的四大组件不能通过内存来共享数据;这就解释了第一种问题出现的原因。
当一个组件在一个新的进程中启动的时候,由于系统要新的进程,并为其分配独立的虚拟机,这个过程其实就是启动一个应用的过程,那么自然会重新创建新的Application;这就解释了第二种问题出现的原因。
不同的进程有不同的内存地址,那么不管是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象;这就解释了第三种问题出现的原因。
SharedPreferences是通过读写XML文件来实现,并发读写有可能出现问题;这就解释了第四种问题出现的原因。