Coder Social home page Coder Social logo

abridge's Introduction

最新版本

模块 abridge
最新版本 Download

更新说明:为了让用户能更灵活的使用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群

qq交流群.jpeg

Email

[email protected]

[email protected]

七、欢迎 fork、issues

abridge's People

Contributors

yifei8 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

abridge's Issues

是否考虑支持消息回调?

很多场景需要得到发送消息之后的结果,是否考虑可以增加发送消息结果返回?
如同步的
Bundle sendMessageSync(Message message)
以及异步的
void sendMessageAsync(Message message, Callback callback)

如果是多个进程间的通信问题

你好 有没有考虑 A进程要和B进程通信 但是不想要C进程收到消息 但是B又会和C进程通信 不想让A知道的情况, 你的代码结构 就是观察者模式的样子 这个是可以优化的

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.