完美解決Android進(jìn)程間通信—ABridge

最新版本1.0.1

為了讓用戶能更靈活到進(jìn)行進(jìn)程間的通信,不在局限于Activity使用場景,1.0.0版本做了全面的改進(jìn),可方便用戶在進(jìn)程中任何地方和另一個(gè)進(jìn)程進(jìn)行通信,同時(shí)也不在支持0.0.1的用法,給用戶帶來的不便盡請諒解。老版本用戶可根據(jù)新版本的用法做簡單的改動(dòng)就可以升級上來。

Android 進(jìn)程間通信最牛方案,為簡單而生

Github 源碼: ABridge

一、介紹

做Android開發(fā)的小伙伴們是不是經(jīng)常有遇到同一個(gè)公司有多個(gè)App,而這些App之間需要進(jìn)行通信業(yè)務(wù)。于是需要解決這種IPC問題,而ABridge可輕松解決進(jìn)程間通信問題。

二、Android IPC方式

跨進(jìn)程常見的幾種通信方式:Bundle通過Intent傳遞數(shù)據(jù),文件共享,ContentProvider,基于Binder的AIDL和Messenger以及Socket。

三、IPC是what?

也許有些小伙伴還不是很清楚IPC概念,這里我簡單的概述一下。

IPC是 Inter-Process Communication的縮寫,意為進(jìn)程間通信或跨進(jìn)程通信,是指兩個(gè)進(jìn)程之間進(jìn)行數(shù)據(jù)交換的過程。

線程是CPU調(diào)度的最小單元,同時(shí)線程是一種有限的系統(tǒng)資源。進(jìn)程一般指一個(gè)執(zhí)行單元,在PC和移動(dòng)設(shè)備上指一個(gè)程序或者一個(gè)應(yīng)用。一個(gè)進(jìn)程可以包含多個(gè)線程,因此進(jìn)程和線程是包含與被包含的關(guān)系。最簡單的情況下,一個(gè)進(jìn)程中只可以有一個(gè)線程,即主線程,在Android中也叫UI線程。

IPC不是Android中所獨(dú)有的,任何一個(gè)操作系統(tǒng)都需要相應(yīng)的IPC機(jī)制,比如Windows上可以通過剪貼板等來進(jìn)行進(jìn)程間通信。Android是一種基于Linux內(nèi)核的移動(dòng)操作系統(tǒng),它的進(jìn)程間通信方式并不能完全繼承自Linux,它有自己的進(jìn)程間通信方式。

四、Why ABridge

在使用ABridge之前,我們可以通過上面的方式來實(shí)現(xiàn)IPC,但這些方式實(shí)現(xiàn)過程繁瑣,學(xué)習(xí)成本較高。為此,ABridge誕生了——一款可以幾行代碼輕松實(shí)現(xiàn)跨進(jìn)程通信框架。

ABridge提供了兩種方案進(jìn)行跨進(jìn)程來滿足不同場景的業(yè)務(wù)需求:一種是基于Messenger,另一種是基于AIDL。當(dāng)然Messenger本質(zhì)也是AIDL,只是進(jìn)行了封裝,開發(fā)的時(shí)候不用再寫.aidl文件。

五、新版本基本用法

step1 添加依賴

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

step2 初始化

  public class MainApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        //注意這里的packagename,需要通信的多個(gè)app只能使用一個(gè)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 注冊回調(diào)
 IBridge.registerMessengerCallBack(callBack = new AbridgeMessengerCallBack() {
            @Override
            public void receiveMessage(Message message) {
                if (message.arg1 == ACTIVITYID) {
                    //todo客戶端接受服務(wù)端傳來的消息
                    
                }
            }
        });
        
// 2 反注冊回調(diào),避免內(nèi)存泄漏
IBridge.uRegisterMessengerCallBack(callBack);

// 3 發(fā)送消息
 Message message = Message.obtain();
 message.arg1 = ACTIVITYID;
 //注意這里,把`Activity`的`Messenger`賦值給了`message`中,當(dāng)然可能你已經(jīng)發(fā)現(xiàn)這個(gè)就是`Service`中我們調(diào)用的`msg.replyTo`了。
 Bundle bundle = new Bundle();
 bundle.putString("content", messageStr);
 message.setData(bundle);
 
 IBridge.sendMessengerMessage(message);

3.2 基于AIDL IPC

 // 1 注冊回調(diào)
 IBridge.registerAIDLCallBack(callBack = new AbridgeCallBack() {
            @Override
            public void receiveMessage(String message) {
                //todo客戶端接受服務(wù)端傳來的消息
            }
        });
        
// 2 反注冊回調(diào),避免內(nèi)存泄漏
IBridge.uRegisterAIDLCallBack(callBack);

// 3 發(fā)送消息
String message = "待發(fā)送消息";
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,需要通信的多個(gè)app只能使用一個(gè)packagename
          //即使用一個(gè)app作為server啟動(dòng)這個(gè)共享服務(wù)來進(jìn)行通信
          IBridge.init(this, "packagename");
      }
    }
    

    step3 需要通信的activity實(shí)現(xiàn)接口 MessengerReceiver

    public class TestMessengerActivity extends AppCompatActivity implements MessengerReceiver {
     //跨進(jìn)程通信的 發(fā)送器
     private MessengerSender sender;
    
     //MessengerReceiver 接口方法 設(shè)置發(fā)送器
     @Override
      public void setSender(MessengerSender sender) {
          this.sender = sender;
      }
     
      //MessengerReceiver 接口方法  接受跨進(jìn)程發(fā)送過來的message
      @Override
      public void receiveMessage(Message message) {
          if (message.arg1 == ACTIVITYID) {
              //客戶端接受服務(wù)端傳來的消息
              String str = (String) message.getData().get("content");
              tv_show_in_message.setText(str);
          }
      }
    }
    

    step4 跨進(jìn)程發(fā)送信息

     //接上文
      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,需要通信的多個(gè)app只能使用一個(gè)packagename
          //即使用一個(gè)app作為server啟動(dòng)這個(gè)共享服務(wù)來進(jìn)行通信
          IBridge.init(this, "packagename");
      }
    }
    

    step3 需要通信的activity實(shí)現(xiàn)接口 MessengerReceiver

    public class TestAIDLActivity extends AppCompatActivity implements IReceiver {
     //跨進(jìn)程通信的 發(fā)送器
     private ISender sender;
    
     //IReceiver 接口方法 設(shè)置發(fā)送器
    @Override
      public void setSender(ISender sender) {
          this.send = sender;
      }
    
     //IReceiver 接口方法  接受跨進(jìn)程發(fā)送過來的message
      @Override
      public void receiveMessage(String message) {
          tv_user.setText(message);
      }
    
    }
    

    step4 跨進(jìn)程發(fā)送信息

     //接上文
      public void sendMessage(String messageStr)
          send.sendMessage(messageStr);
      }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容