ABridge
最新版本
| 模块 | abridge |
|---|---|
| 最新版本 |
更新说明:为了让用户能更灵活的使用 ABridge 进行进程间的通信,且不在局限于 Activity 使用场景,1.0.0 版本做了全面的改进,可方便用户在进程中任何地方和另一个进程进行通信,同时也不在支持 0.0.1 的用法,给用户带来的不便尽请谅解。老版本用户可根据新版本的用法做简单的改动就可以升级上来。
Android 进程间通信最牛方案,为简单而生
Github 源码: ABridge
一、介绍
做 Android 开发的小伙伴们是不是经常有遇到同一个公司有多个 App,而这些 App 之间需要进行通信业务。于是需要解决这种 IPC 问题,而 ABridge 可轻松解决进程间通信问题。
二、Android IPC 方式
跨进程常见的几种通信方式:Bundle 通过 Intent 传递数据,文件共享,ContentProvider,基于 Binder 的 AIDL 和 Messenger 以及 Socket。
三、IPC 是 what?
也许有些小伙伴还不是很清楚 IPC 概念,这里我简单的概述一下。
IPC 是 Inter-Process Communication 的缩写,意为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。
线程是 CPU 调度的最小单元,同时线程是一种有限的系统资源。进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。最简单的情况下,一个进程中只可以有一个线程,即主线程,在 Android 中也叫 UI 线程。
IPC 不是 Android 中所独有的,任何一个操作系统都需要相应的 IPC 机制,比如 Windows 上可以通过剪贴板等来进行进程间通信。Android 是一种基于 Linux 内核的移动操作系统,它的进程间通信方式并不能完全继承自 Linux,它有自己的进程间通信方式。
四、Why ABridge
在使用 ABridge 之前,我们可以通过上面的方式来实现 IPC,但这些方式实现过程繁琐,学习成本较高。为此,ABridge 诞生了——一款可以几行代码轻松实现跨进程通信框架。
ABridge 提供了两种方案进行跨进程来满足不同场景的业务需求:一种是基于 Messenger,另一种是基于 AIDL。当然 Messenger 本质也是 AIDL,只是进行了封装,开发的时候不用再写.aidl 文件。
五、新版本基本用法
step1 添加依赖
api "com.sjtu.yifei:abridge:_latestVersion"
step2 初始化
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//注意这里的 packagename,需要通信的多个 app 只能使用一个 packagename
//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();
}
}
step3 通信使用
3.1 基于 Messenger IPC
// 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);
3.2 基于 AIDL IPC
// 1 注册回调
IBridge.registerAIDLCallBack(callBack = new AbridgeCallBack() {
@Override
public void receiveMessage(String message) {
//todo 客户端接受服务端传来的消息
}
});
// 2 反注册回调,避免内存泄漏
IBridge.uRegisterAIDLCallBack(callBack);
// 3 发送消息
String message = "待发送消息";
IBridge.sendAIDLMessage(message);
注、版本更新到 1.0.0 以后将弃用0.0.1 版本基本用法以下是老版本用法
方案一:基于 Messenger
step1 添加依赖
api "com.sjtu.yifei:abridge:xxx.xxx.xxx"step2 初始化
public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); //注意这里的 packagename,需要通信的多个 app 只能使用一个 packagename //即使用一个 app 作为 server 启动这个共享服务来进行通信 IBridge.init(this, "packagename"); } }step3 需要通信的 activity 实现接口 MessengerReceiver
public class TestMessengerActivity extends AppCompatActivity implements MessengerReceiver { //跨进程通信的 发送器 private MessengerSender sender; //MessengerReceiver 接口方法 设置发送器 @Override public void setSender(MessengerSender sender) { this.sender = sender; } //MessengerReceiver 接口方法 接受跨进程发送过来的 message @Override public void receiveMessage(Message message) { if (message.arg1 == ACTIVITYID) { //客户端接受服务端传来的消息 String str = (String) message.getData().get("content"); tv_show_in_message.setText(str); } } }step4 跨进程发送信息
//接上文 public void sendMessage(String messageStr) Message message = Message.obtain(); message.arg1 = ACTIVITYID; Bundle bundle = new Bundle(); bundle.putString("content", messageStr); message.setData(bundle); sender.sendMessage(message); }方案二:基于 AIDL
step1 添加依赖
api "com.sjtu.yifei:abridge:xxx.xxx.xxx"step2 初始化
public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); //注意这里的 packagename,需要通信的多个 app 只能使用一个 packagename //即使用一个 app 作为 server 启动这个共享服务来进行通信 IBridge.init(this, "packagename"); } }step3 需要通信的 activity 实现接口 MessengerReceiver
public class TestAIDLActivity extends AppCompatActivity implements IReceiver { //跨进程通信的 发送器 private ISender sender; //IReceiver 接口方法 设置发送器 @Override public void setSender(ISender sender) { this.send = sender; } //IReceiver 接口方法 接受跨进程发送过来的 message @Override public void receiveMessage(String message) { tv_user.setText(message); } }step4 跨进程发送信息
//接上文 public void sendMessage(String messageStr) send.sendMessage(messageStr); }六、沟通
qq 群
yifei8@gmail.com
644912187@qq.com
