ABridge进程间通信介绍

原文链接: https://github.com/yifei8/ABridge

GitHub地址:https://github.com/yifei8/ABridge

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

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

IPC不是Android中所独有的,任何一个操作系统都需要相应的IPC机制,比如Windows上可以通过剪贴板等来进行进程间通信。Android是一种基于Linux内核的移动操作系统,它的进程间通信方式并不能完全继承自Linux,它有自己的进程间通信方式。

二、在使用ABridge之前,我们可以通过上面的方式来实现IPC,但这些方式实现过程繁琐,学习成本较高。为此,ABridge诞生了——一款可以几行代码轻松实现跨进程通信框架。

ABridge提供了两种方案进行跨进程来满足不同场景的业务需求:一种是基于Messenger,另一种是基于AIDL。当然Messenger本质也是AIDL,只是进行了封装,开发的时候不用再写.aidl文件。

三、集成

1、添加依赖

api "com.sjtu.yifei:abridge:_latestVersion"

2、初始化

public class MainApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        //注意这里的packagename,通信的多个app使用其中的一个app的包名
        //ABridge初始化有两种方式
        //方式一:基于Messenger
        IBridge.init(this, "com.sjtu.yifei.aidlserver", IBridge.AbridgeType.MESSENGER);
        //方式二:基于自定义的AIDL
        IBridge.init(this, "com.sjtu.yifei.aidlserver", IBridge.AbridgeType.AIDL);
    }

    @Override
    public void onTerminate() {
        //注意释放
        IBridge.recycle();
        super.onTerminate();
    }
  }

3、基于Messager的通信

// 1 注册回调
 IBridge.registerMessengerCallBack(callBack = new AbridgeMessengerCallBack() {
            @Override
            public void receiveMessage(Message message) {
                if (message.arg1 == ACTIVITYID) {
                    //todo客户端接受服务端传来的消息
                    
                }
            }
        });
        
// 2 反注册回调,避免内存泄漏
IBridge.uRegisterMessengerCallBack(callBack);

// 3 发送消息
 Message message = Message.obtain();
 message.arg1 = ACTIVITYID;
 //注意这里,把`Activity`的`Messenger`赋值给了`message`中,当然可能你已经发现这个就是`Service`中我们调用的`msg.replyTo`了。
 Bundle bundle = new Bundle();
 bundle.putString("content", messageStr);
 message.setData(bundle);
 IBridge.sendMessengerMessage(message);

4、基于aidl的通信

// 1 注册回调
 IBridge.registerAIDLCallBack(callBack = new AbridgeCallBack() {
            @Override
            public void receiveMessage(String message) {
                //todo客户端接受服务端传来的消息
            }
        });
        
// 2 反注册回调,避免内存泄漏
IBridge.uRegisterAIDLCallBack(callBack);

// 3 发送消息
String message = "待发送消息";
IBridge.sendAIDLMessage(message);

四、注意点

1、通过aidl和messager两种方式进行进程间通信,初始化的时候只需要填写通信app中的其中一个app的包名即可

2、两种方式通信的时候,每次发送消息server和client都会收到, messager有what和arg1、arg2来区分是否是对方发过来的消息,但是aidl方式传字符串,需要自己区分,例如用数据json里面某个字段来区分

3、Messager底层也是aidl,只是服务端进程处理的时候是单线程的,类似于handler,从队列中一个一个取出来处理

4、这个只是发消息,如果一个app需要给另一个app提供很多接口供其调用的话还是需要自己写aidl

你可能感兴趣的:(ABridge进程间通信介绍)