Android中的IPC机制详解

声明: IPC机制没有怎么系统化的接触,主要是AIDL接触过,结合<<Android开发艺术探索>>这本书,系统的学习一下子这一块知识点,作为自己的一个学习笔记.分享给大家,有什么理解不到位望大家指明,我非常感谢你的指导.

一.什么是IPC

IPC是一个缩写: intent process communication   进程间通信

 进程: 什么是进程:  一个应用就是一个进程,或者是一个程序

线程: 什么是线程   线程就是cpu可以调度的最小单元.

两者之间的联系:进程中可以包含多个线程.

ANR : Application NO Responsing  应用无响应  

在Android中如果Activity在五秒内没有响应就会出现ANR,在BroadReceiver中超过十秒没有响应就会出现ANR,在服务中出现二十秒没有执行完毕,就会出现ANR.

Android是一种基于Linux内核的移动操作系统,他的进程间通信不会完全继承Linux,而是有自己的进程间通信方式;在Android中最有特色的进程间通信方式就是Binder了,通过Binder可以轻松地实现进程间通信。

Android还支持Socket,通过Socket也可以实现任意两个终端或者两个进程之间的通信。

二.主要是做什么的

1.IPC的使用场景:

第一就是: 我们需要一个应用需要多进程的方式来实现(例如加大一个应用的使用内存空间,Android中对一个应用的的内存使用使用限制的)

 第二种就是: 我们在使用一个应用的时候会使用其他程序的数据,我们知道Android为每一个应用都分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,也就是说一个应用的就是一个进程,一个应用需要获取其他应用的数据,也就是是多线程间通信,例如:我们在添加号码的时候需要获取联系人应用的数据,我们使用ContentProvider来解决,因为Content Provider就是一种进程间通信的方法.

2.IPC的作用:

主要是解决了进程间通信的

3.Android中使用多进程的方法:

Android中使用多进程的方法只有一种就是: 四大组件在清单文件中声明的时候添加 android: process 属性.

4.对象的序列化:

我们经常使用Intent来传递来进行数据的传递:只是在传递的时候Intent传递的对象是序列化的对象.

  我们使用的序列化的方式有两种,分别是 Serializable接口和使用Parcelable接口;而Serializable是Java给我提供的一个序列化的接口,是一个空接口,对于对象的序列化和反序列化都会自动实现.

 在Android中给我也提供了新的序列化的接口就是Parcelable接口:intent也是一个实现了接口的类.

public class Intent implements Parcelable, Cloneable {
    //其他代码:........
}
  总结: Serializable是java提供的序列化接口,使用简单,但是开销很大,序列化和反序列化需要操作大量的I/O操作.

   Parcelable是Android提供的,序列化接口,使用起来复杂,效率更高.主要用在内存序列化上.

三.Android中最特色的binder

 Android中Binder主要用在Service中,常见的就是AIDL和Messenger,而Messenger的底层是AIDL.

源码:
public class Binder implements IBinder {
    /*
     * Set this flag to true to detect anonymous, local or member classes
     * that extend this Binder class and that are not static. These kind
     * of classes can potentially create leaks.
     */
    private static final boolean FIND_POTENTIAL_LEAKS = false;
    private static final boolean CHECK_PARCEL_SIZE = false;
    static final String TAG = "Binder";
//其他代码
}
直接来说 Binder是一个实现了IBinder接口的类;我们也看做多进程间通信的方法,也可以理解为是种虚拟的物理设备,设备驱动是/dev/binder,从Android Framework来说,是连接ServiceManger连接各种Manager和MangerService的桥梁,各种Manger例如 Activity Manger 和WindowManger等. 从Android的应用层来说: Binder是客户端和服务端进行通信的媒介.

 

四.具体有哪些,分别是,源码分析

第一种:使用AIDL



AIDL的具体使用过程.




第二种: 使用共享文件




第三种: Messenger

  注意: 区别于message  是不一样的的,message是消息载体,在Android消息机制中出现,Messenger是信使的意思.


第四种: 使用Bundle




第五种: ContentProvider

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


第六种: 使用Socket

四:Binder连接池


五:各种进程间通信的区别和总结

什么是RPC

Android平台上面的RPC(Remote Procedure Call)也即远程例程调用。RPC是IPC中的一种,但是它是以调用在本地或者另一个进程,甚至是另一个主机上的方法的机制。RPC的目的就是可以让程序不用担心方法具体是在哪个进程里面或者哪以机器上面,就像正常的本地方法那样去调用即可,RPC机制会处理所有的具体细节。RPC一般用IDL(Interface Definition Language)来描述,实现则要看具体的平台和语言。

总结:

 Bundle : 优点: 简单易用   缺点: 只能传输Bundle支持的数据类型

使用场景: 四大组件之间的进程间通信


 文件共享:  优点: 简单易用     缺点: 不适合高并发开发场景 ,无法做到进程间及时通信

 使用场景:   适用于没有高并发的访问,并且用于交换简单的数据


AIDL: 优点: 支持一对多的并发通信,支持实时通信   缺点: 使用比较的复杂;需要处理好线程同步

使用的场景; 一对多,并且右RPC的需求


 Messenger  功能一般,支持一对多串行通信,支持实时通信   缺点; 不能很好的处理高并发情形,不支持RPC,只支持Bundle支持的数类型.

使用场景: 适合于低并发的一对多的即时通信,无RPC要求,或者无需立即返回结果的RPC需求

 

ContentProvider  优点,在数据源分访问方面功能强大,支持一对多并发数据共享,可以通过call方法来扩展其他操作

缺点: 收到AIDL约束,主要是对数据源的CRUD(增删改查)的操作.

使用场景: 一对多进程间的数据共享


socket  优点; 功能强大,通过网络传输字节流,支持一对多实时通信    缺点: 实现细节繁琐,不支持直接RPC

 使用场景: 网络的数据交换.


 

                  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值