Android IPC机制(一)

Android IPC简介

IPC是Inter-ProcessCommutication的缩写,是进程间通信的意思 ,而进程是由线程组成的,线程是CPU调度的最小单元。

多进程产生的问题

1、静态变量和单例模式完全失效 
2、线程同步机制完全失效 
3、SharePrefernces的可靠性降低 

4、Application会被多次创建

实现Android跨进程通信的方式

名称 优点 缺点 适用场景
Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件间的进程通信
文件共享 简单易用 不适合高并发场景,并且无法做到进 程间的及时通信 无并发访问情形,交换简单 的数据实时性不高的场景
AIDL 功能强大。支持一对多 并发通信,支持实时通信 使用稍复杂,需要处理好线程同步 一对多通信且有RPC需求
Messenger 功能一般,支持一对多串行 通信,支持实时通信 不能很好的处理高并发情形,不支持 RPC,数据通过Messenger进行传输, 因此只能传输Bundle支持的数据类型 低并发的一对多的即时通信, 无RPC需求,或者无需要返回 结果的RPC需求
ContentProvider 在数据源方面访问方面强大, 支持一对多并发数据共享,可 通过Call方法扩展其他操作 可以理解成受约束的AIDL,主要提供 数据源的CRUD操作 一对多的进程间的数据共享
Socket 功能强大,可以通过网络传输 字节流,支持一对多并发实时通信 实现细节稍微繁琐,不支持直接的RPC 网络数据交换
(此表主要参考开发艺术探索)
实现Android跨进程通信的要点

要想在线程间实现线程通信那么对象必须能够序列化,类实现序列化的方法有两种

一 实现Serializable接口,作为系统序列化和反序列化的标记,再次我们要注意,给类增加ID,在反序列化时能够识别为同一个类。

二 实现Parcelable接口

public class Book implements Parcelable{

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Book() {
    }

    public Book(int id, String name) {
        this.id = id;
        this.name = name;
    }

    protected Book(Parcel in) {
        this.id=in.readInt();
        this.name=in.readString();
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;//返回对象的内容描述,如果含有文件描述返回1,几乎所有情况都返回0
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(id);
        parcel.writeString(name);

    }


}

这两种序列化的方式中Serializable使用比较简单,但是开销大,效率比较低,适合相对较小的数据。Parcelable则使用起来稍

复杂,但是Android推荐序列化方式,开销小,效率比较高。

Binder

Binder是一个类,一个实现了IBinder接口的类,从IPC的角度来讲它是一种跨进程的通信方式,从Framwork角度来讲,Binder是ServiceManager 

链接各种manager(ActivityManager 、WindowManager等)和相应ManagerService的桥梁。具体可以通过AIDL来了解。

介绍了相关的IPC知识那么下一篇我们将介绍IPC具体的实现方法。












你可能感兴趣的:(Android学习笔记,IPC,跨进程通信,序列化)