ABridge

Project Url: yifei8/ABridge
Introduction: Android 进程间通信最牛方案,为简单而生
More: Author   ReportBugs   OfficialWebsite   
Tags:

最新版本

模块 abridge
最新版本 Download

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 文件。

五、基本用法

  • 方案一:基于 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 群

qq 交流群.jpeg

Email

yifei8@gmail.com

644912187@qq.com

七、欢迎 fork、issues

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea