概念

进程:是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体,是一个"执行中的程序"。不只是程序的代码,还包括当前的活动。

线程:是进程的一个实体,是Cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程比进程更小,基本上不拥有系统资源,故对它的调度所用资源很少,能更高效的提高系统内多个程序间并发执行的程度。

 

进程与线程区别:

定义方面,两者定义就不一样。(一个进程中可以有多个线程);

角色方面,在支持线程机制的系统中,进程是系统资源分配的单位,线程是cpu调度的基本单位;

独立性方面,进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在;

资源共享方面,在进程之间不能共享资源,而线程共享所在进程的地址空间 和 其他资源。同时线程还有自己的栈 和 栈指针,程序计数器等寄存器。

开销方面:进程切换的开销较大,而线程相对较小。

 

定义多进程

Android中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。

不指定process属性,则默认运行在主进程中,主进程名字为包名。

android:process = package:remote,将运行在package:remote进程中,属于全局进程,其他具有相同shareUID与签名的app可以运行在这个进程中。

android:process = :remote,将运行在默认包名的:remote进程中,这是app的私有进程,不允许其他app访问。

android使用多进程会引发的问题(不同进程拥有各自独立的虚拟机、application、内存空间)

1.静态成员 和 单例模式 失效:每个进程保持各自的静态成员 和 单例,相互独立。

2.线程同步机制失效:每个进程有自己的线程锁。

3.SharedPreferences可靠性下降:不支持并发写,会出现脏数据。

4.Application多次创建:不同进程运行在不同的虚拟机中,每个虚拟机启动会创建自己的Application,自定义Application时生命周期会混乱。

android中多进程之间不能直接通信,为了解决这个问题,IPC出现了。

IPC

Inter-Process Communication——进程间通信,是指进程间数据交互的过程。

Android底层是基于Linux,而Linux基于安全考虑,不允许两个进程间直接操作对方的数据,这就是进程隔离。

虽然Android基于Linux,但并不能继承Linux中的进程通信方式,Android有着自己的进程间通信方式。常用如下:

一、Bundle / Intent传递数据

1.Activity,Service,Receiver都支持在Intent中传递Bundle数据, 而Bundle实现了Parcelable接口,可以在不同的进程间传输。

2.在一个进程中启动了另一个进程的Activity,Service,Receiver,可以在Bundle中附加要传递的数据 通过Intent发送出去。

 

二、文件共享

    对同一个文件先后写读,从而实现传输,Linux机制下,可以对文件并发写,需要注意同步,而Windows下不支持并发读或写。

1.在Windows上,一个文件如果被加了排斥锁会导致其他线程无法对其进行访问,包括读写;而Android基于Linux,使得其可以并发读取文件,甚至允许两个线程同时对一个文件进行读写操作,尽管这样可能会出现问题。

2.可以在一个进程中序列化一个对象到文件系统中,在另一个进程中反序列化恢复这个对象(注意:并不是同一个对象,只是内容相同而已)。

3.SharedPreferences是个特例,系统对它的读写有一定的缓存策略,即内存中会有一份SharedPreferenced文件的缓存,系统对它的读写就变得不可靠,当面对高并发的读写访问,SharedPreferences有很大的几率丢失数据,因此,IPC不建议采用SharedPreferences。

三、Messenger(基于Binder)

Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)的连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。

双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

 

四、AIDL(基于Binder)

android进程间通信-AIDL

五、ContentProvider(基于Binder)

六、Socket