IPC全称Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程,
首先理解进程和线程的区别,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。最简单的情况下,一个进程中可以包含多个线程,即主线程,在Android里面主线程也叫UI线程,在UI线程里才能操作界面元素。很多时候,一个进程中需要执行大量的耗时任务,如果这些任务放在主线程中执行就会造成界面无法响应,严重影响用户体验,这种情况下在PC系统和移动系统中都存在,在Android中有一个特殊的名字叫ANR,即应用无响应。解决这个问题就需要用到线程,把一些耗时的任务放在线程中即可。
Android中最有特色的进程间通信方式就是Binder了,
可能由于以下原因,我们要采用多进程,第一种情况是应用因为某些原因自身需要采用多进程的模式来实现,至于原因,可能有很多,比如有些模块由于特殊原因需要运行在单独的进程中,又或者为了加大一个应用可使用的内存所以需要通过多进程来获取多份内存空间。Android对单个应用所使用的最大内存做了限制,早起的一些版本可能是16MB,不同设备有不同的大小。另一种情况是当前应用需要向其他应用获取数据,由于是两个应用,所以必须采用跨进程的方式来获取数据,甚至我们通过系统提供的GontentProvider去查询数据的时候,其实也是一种进程通信,只不过通信细节被系统内部屏蔽了,我们无法感知而已。
开启多进程
正常情况下开启多进程是通过给四大组件指定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.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" />
假设当前的进程为”com.ryg.chapter_2”,当程序启动时,SecondActivityde 进程名为com.ryg.chapter_2:remote,ThirdActivity启动时 进程名为 com.ryg.chapter_2.remote
“:”是指的当前应用的私有进程,其他应用不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用可以通过ShareUID的方式和它跑在同一个进程中。
多进程带来的问题
我们知道Android会为每一个应用分配一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。不同虚拟机中的相同类是互不干扰的。
一般来说,使用多进程会造成如下几个方面的问题:
(1)静态成员和单例模式完全失效。
(2)线程同步机制完全失效。
(3)SharedPreferences的可靠性下降。
(4)Application会多次创建。
第一个第二个的原因是显而易见的。
第三个的原因是sp的本质是通过读写xml文件来实现的,并发写显然是可能出问题的,甚至并发读/写都有可能出问题。第四个问题是的原因是运行在同一个进程中的组件属于同一个虚拟机和同一个Application的。
所以进程间进行数据传输的主要有以下几种方式
1 intent
2 共享文件
3sp
4基于Binder的Messager和AIDL以及socket