Android 高级之跨进程通信(IPC)

作者: Kevin_小飞象 | 来源:发表于2019-03-29 16:06 被阅读6次

    先看一下 Android 中跨进程通信的方式:

    方式 优点 适用场景
    Binder 高效、安全性高、使用简单 四大组件的进程间通信
    Messenger 支持一对多串行通信,支持实时通信 低并发的一对多即时通信,无RPC需求,或者无需要返回结果的RPC需求
    AIDL 功能强大,支持一对多并发通信 一对多通信且有RPC需求
    ContentProvider 在数据访问方面功能强大,支持一对多并发数据共享 一对多的进程间数据共享
    Socket 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 网络数据交换
    文件共享 简单易用 无并发访问情形,交换简单的数据,实时性不高的场景

    Binder

    Binder 是 Android 系统进程间通信(IPC)方式之一。
    参考:
    1. Android Bander设计与实现 - 设计篇
    2. 图文详解 Android Binder跨进程通信的原理

    Messenger

    Messenger 是一种轻量级的 IPC 方案并对 AIDL 进行了封装,它实现起来比较容易。
    参考:
    用Messenger进行进程间通信

    AIDL

    在 AIDL 文件中支持的数据类型包括:

    • 基本数据类型
    • String和CharSequence
    • List:只支持ArrayList,里面的元素都必须被AIDL支持
    • Map:只支持HashMap,里面的元素必须被AIDL 支持
    • 实现Parcelable接口的对象
    • 所有AIDL接口

    参考:
    在Android Studio中使用AIDL实现跨进程方法调用

    ContentProvider

    ContentProvider 为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的。
    参考:
    用ContentProvider进行进程间通信

    Socket

    Socket 也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
    参考:
    用Socket实现跨进程聊天程序

    文件共享

    这种方式解决了不同进程数据传输的问题。
    简单实例:
    进程a写数据:

    Data data = new Data(10,"这是主进程写的数据");
                    try {
                        ObjectOutputStream out = new ObjectOutputStream(
                                new FileOutputStream("/storage/emulated/0/1/sina/sdadas.txt"));
                        out.writeObject(data);
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.d(TAG, "ssss: 序列化的时候失败" + e.toString());
                    }
    

    进程b读取数据:

    Data data = null;
                    try {
                        ObjectInputStream in = new ObjectInputStream(
                                new FileInputStream("/storage/emulated/0/1/sina/sdadas.txt"));
                        data = (Data) in.readObject();
                    }catch (IOException e){
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
    
                    if(data != null){
                        Log.d(TAG, "onClick: 读取成功 , data.id = "  + data.id + "data.name = " + data.name);
                    }else {
                        Log.d(TAG, "onClick: 错误");
                    }
    

    相关文章

      网友评论

        本文标题:Android 高级之跨进程通信(IPC)

        本文链接:https://www.haomeiwen.com/subject/myglbqtx.html