Android的IPC机制(进程间通信)

1.Android IPC简介

        IPC是Inter-Process-Communication 的缩写,含义是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。

2.进程和线程的概念

       线程是CPU调度的最单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程与线程之间是包含与被包含的关系。最简单的情况下,一个进程只包含一个线程,即主线程,在Android里面主线程又叫UI线程,在UI线程里面才可以操作界面元素。

3.多进程使用情况

      1)一个应用由于某种原因自身需要采用多进程模式来实现,原因有多种:有些模块由于特殊原因需要运行在单独的进程中,又或者为了加大一个应用的可使用内存所以需要通过运行在单独的进程中。

      2)当前应用需要向其它应用获取数据。

4.如何使用多进程

     Android中使用多进程只有一种方式:在AndroidMenifest中为四大组件指定android:process属性,也就是说我们无法给一个线程或者一个实体类指定其运行时的所在进程。其实还有另外一种非常规的多进程方法,那就通过JNI在native层fork一个新的进程,但是这种方式特殊,也不是常用的创建多进程的方式,因此我恩暂时不考虑这种方式。

     为当前组件指定process属性是以“:”开头的进程属于当前应用的私有进程,其他的应用的组件不可以和它跑在同一个进程中,而此进程的进程名全称为包名加上process属性名称;而进程名不以“:”开头的进程属于全局进程,其它应用通过ShareUID方式可以和它跑在同一个进程中,而此进程的进程名全称就是当前process属性名称。

5.ShareUID介绍

     我们知道Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。这里要说明的是,两个应用通过ShareUID跑在通过一个进程中是有要求的,需要这两个应用有相同的ShareUID并且签名相同才可以。在这种情况下,他们可以互相访问对方的私有数据,比如data目录、组件信息等,不管他们是否跑在同一个进程中。当然如果她们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据,或者说他们看起来就像是一个应用的两个部分。

6.使用多进程会造成的问题

     1)静态成员和单例模式完全失效;

     2)线程同步机制完全失效;

    3)SharedPreference的可靠性下降;

    4)Application会多次创建。

7、实现跨进程间通信的方式

     通过共享文件和SharedPreference,使用intent来传递是输、ContentPRovider、基于BInder的Messenger和AIDL以及Socket等。

     Binder是Android中的一个类,它实现了IBinder接口,主要用于Service中,包括AIDL和Messenger,其中普通Service中的BInder不涉及进程间通信,所以较为简单而Messenger的底层其实是AIDL,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

AIDL:

AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。

通过编写aidl文件来设计想要暴露的接口,编译后会自动生成响应的java文件,服务器将接口的具体实现写在Stub中,用iBinder对象传递给客户端,客户端bindService的时候,用asInterface的形式将iBinder还原成接口,再调用其中的方法。

ContentProvider:

系统四大组件之一,底层也是Binder实现,主要用来为其他APP提供数据,可以说天生就是为进程通信而生的。自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse("content://authorities")。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。

Socket:

学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。



你可能感兴趣的:(Android的IPC机制(进程间通信))