亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android基于Aidl的跨進程間雙向通信管理中心

2019-10-21 21:35:31
字體:
來源:轉載
供稿:網友

得益于最近有點時間和精力,我想起來了一件事。那就是在上家公司,公司要求做一個APP進程間的通信的功能,并不是APP對APP的直接跨進程通信,而是通過一個服務中心,做接收,然后,再轉發,避免應用之間耦合性高,不然的話,新增一個APP,其他APP也要進行升級更新(類似于有服務中心的聊天室)。

我就花幾個小時寫點東西吧,順便記錄一下

大家都知道在Android設備上,有很多方式,比如,廣播,socket,共享內存,aidl等,其中廣播和aidl都是基于android中iBinder機制

廣播:

廣播有缺陷,就是效率不高,有時候會遇到廣播丟失,或者說廣播的隊列過長,導致消息發送慢;

共享內存:

共享內存沒有安全性可言,而且多線程讀寫數據的話,會無法控制

socket:

socket耦合度較高,內存需要拷貝兩次,適用于跨網絡

AIDL:

基于binder,效率高;基于C/S架構,分層清晰,功能明確;有Linux的進程ID概念,更加安全等優點

流程圖

Android,Aidl,跨進程,雙向通信

很簡單的架構,所有的APP消息傳遞都通過Server來做,工程結構如下,center(消息中心),app1,app2都依賴于lib(aidl接口庫)

Android,Aidl,跨進程,雙向通信

利用aidl中的RemoteCallbackList類(原理和源碼我就不多說了,其實Client調用Server是大同小異的,只不過是反者來了一次),來實現client中的接口回調,這樣才能從server主動給client發消息,一般我們都是client主動調用Server,現在輪到Server主動調用client

服務端的代碼如下,你可以按照你項目的要求來做

package com.helang.messagecenterdemo; import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteCallbackList;import android.os.RemoteException;import android.support.annotation.Nullable;import android.util.Log; import com.helang.lib.IMyAidlCallBackInterface;import com.helang.lib.IMyAidlInterface; /** * 消息服務中心(記得在 manifest.xml 加上 android:exported="true") */public class MyService extends Service {  private final static String TAG = MyService.class.getSimpleName();  private RemoteCallbackList<IMyAidlCallBackInterface> callbackList = new RemoteCallbackList<>();//回調的關鍵(API>=17,才能使用)   @Override  public void onCreate() {    super.onCreate();  }   @Nullable  @Override  public IBinder onBind(Intent intent) {    return iBinder;  }   /**   * 實現iBinder   */  private IMyAidlInterface.Stub iBinder = new IMyAidlInterface.Stub() {    @Override    public void sendMessage(String tag, String message) throws RemoteException {      callbackList.beginBroadcast();      sendMessageToAllClient(tag,message);      Log.d(TAG,"tag="+tag+" message="+message);      callbackList.finishBroadcast();    }     @Override    public void registerListener(IMyAidlCallBackInterface listener) throws RemoteException {      callbackList.register(listener);//注冊回調listener      Log.d(TAG,"registerListener");    }     @Override    public void unregisterListener(IMyAidlCallBackInterface listener) throws RemoteException {      callbackList.unregister(listener);//取消回調listener      Log.d(TAG,"unregisterListener");    }  };   /**   * 發送消息給全部的client(你也可以指定發送給某個client,也可   * 以根據自己的業務來封裝一下Bean,記得要實現Parcelable接口來序列化   * @param tag   * @param message   */  private void sendMessageToAllClient(String tag,String message){    for (int i = 0 ; i < callbackList.getRegisteredCallbackCount();i++){      try {        callbackList.getBroadcastItem(i).callback(tag,message);      } catch (RemoteException e) {        e.printStackTrace();      }    }  }}

Client1和Client2代碼是一樣的,就是相互發消息:

package com.helang.app2; import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Handler;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView; import com.helang.lib.IMyAidlCallBackInterface;import com.helang.lib.IMyAidlInterface; public class MainActivity extends AppCompatActivity {  private EditText editText;  private Button bt_send;  private TextView text;   private IMyAidlInterface iMyAidlInterface;  private ServiceCallBack serviceCallBack;   private MyServiceConnection myServiceConnection;   private Handler handler = new Handler();    @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    bt_send = findViewById(R.id.bt_send);    editText = findViewById(R.id.editText);    text = findViewById(R.id.text);     bt_send.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        if (iMyAidlInterface != null){          try {            iMyAidlInterface.sendMessage("app2",editText.getText().toString().trim());          } catch (RemoteException e) {            e.printStackTrace();          }        }      }    });     bindService();  }   @Override  protected void onDestroy() {    super.onDestroy();    unbindService();  }   private void bindService(){    myServiceConnection = new MyServiceConnection();    serviceCallBack = new ServiceCallBack();    Intent intent = new Intent();    intent.setComponent(new ComponentName("com.helang.messagecenterdemo",        "com.helang.messagecenterdemo.MyService"));    startService(intent);//開啟遠程服務    bindService(intent,myServiceConnection,BIND_AUTO_CREATE);//綁定服務   }   private void unbindService(){    if (myServiceConnection != null){      try {        iMyAidlInterface.unregisterListener(serviceCallBack);      } catch (RemoteException e) {        e.printStackTrace();      }      unbindService(myServiceConnection);    }  }   /**   * 連接Service   */  class MyServiceConnection implements ServiceConnection {     @Override    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {      iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);       handler.post(new Runnable() {        @Override        public void run() {          //注冊回調          if (iMyAidlInterface != null){            try {              iMyAidlInterface.registerListener(serviceCallBack);            } catch (RemoteException e) {              e.printStackTrace();            }          }        }      });     }     @Override    public void onServiceDisconnected(ComponentName componentName) {     }  }   /**   * service回到client的類   */  class ServiceCallBack extends IMyAidlCallBackInterface.Stub{     @Override    public void callback(final String tag, final String message) throws RemoteException {      runOnUiThread(new Runnable() {        @Override        public void run() {          text.append("tag="+tag+" message="+message);        }      });    }  }}

看看效果吧,Client2(app2)發消息給Client1(app1)

Android,Aidl,跨進程,雙向通信

Android,Aidl,跨進程,雙向通信

順便說一句,提前打開Center服務,因為android 8.0之后的版本直接遠程開啟其他App后臺進程服務,是行不通了,可以綁定一個前臺進程,網上方法有很多,我這里就簡單處理了

源碼我都放在github:MessageCenter

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线播放| 国产91精品在线播放| 日本sm极度另类视频| 久久久久久网址| 精品网站999www| 国产成人久久久精品一区| 亚洲精品videossex少妇| 国产精品久久久久久久久久久久| 国产成人精品久久二区二区| 国产亚洲欧美日韩美女| 中文字幕在线观看亚洲| 久久欧美在线电影| 亚洲成av人片在线观看香蕉| 欧美日韩国产成人| 欧美亚洲伦理www| 欧美人与物videos| 国产精品日日摸夜夜添夜夜av| 91中文在线观看| 久久久成人的性感天堂| 亚洲精品久久久久久下一站| 国产精品99一区| 国产盗摄xxxx视频xxx69| 亚洲欧美在线一区| 红桃av永久久久| 亚洲已满18点击进入在线看片| 国产欧美一区二区三区视频| 欧美在线视频网站| 美女久久久久久久久久久| 久久中国妇女中文字幕| 国产日韩在线看片| 欧美日韩精品在线观看| 欧美在线一级va免费观看| 亚洲性视频网站| 色综合色综合久久综合频道88| 欧美裸体xxxx极品少妇软件| 538国产精品一区二区在线| 日韩专区中文字幕| 精品国产乱码久久久久久婷婷| 美日韩丰满少妇在线观看| 亚洲男人的天堂在线播放| 午夜精品福利视频| 91精品国产91久久久久久吃药| 北条麻妃一区二区在线观看| 欧美性生交xxxxx久久久| 亚洲伊人第一页| 亚洲免费中文字幕| 国产精品偷伦免费视频观看的| 神马久久桃色视频| 亚洲男人的天堂在线播放| 久久久久国产一区二区三区| 国产成人精品电影久久久| 欧美成人在线免费| 狠狠色狠狠色综合日日小说| 亚洲成人动漫在线播放| 日韩成人在线视频| 欧美性猛交丰臀xxxxx网站| 久久精视频免费在线久久完整在线看| 亚洲精品wwww| 精品国产一区二区三区在线观看| 日本视频久久久| 国产精品久久久久91| 国产精品色婷婷视频| 97av在线影院| 热99精品只有里视频精品| 亚洲天堂av女优| 2018中文字幕一区二区三区| 国产精品扒开腿做爽爽爽男男| 精品日本美女福利在线观看| 国产精品亚洲第一区| 国语自产精品视频在线看一大j8| 伊人久久久久久久久久| 欧美性xxxx极品hd欧美风情| 北条麻妃在线一区二区| 综合136福利视频在线| 国产精品亚洲第一区| 精品亚洲精品福利线在观看| 夜夜嗨av一区二区三区免费区| 欧美日韩999| 国产欧美日韩最新| www日韩中文字幕在线看| 久久国产精品亚洲| 欧洲精品毛片网站| 久久色免费在线视频| 欧美高清视频一区二区| 亚洲三级 欧美三级| 久久久精品视频在线观看| 在线播放亚洲激情| 欧美日韩在线另类| 精品国产31久久久久久| 亚洲欧洲视频在线| 欧美极品少妇xxxxⅹ免费视频| 欧美性高潮在线| 亚洲精品欧美极品| 欧美日韩国产精品| 亚洲精品99久久久久中文字幕| 欧美麻豆久久久久久中文| 九九视频这里只有精品| 国产亚洲成av人片在线观看桃| 亚洲女人天堂成人av在线| 欧美日本中文字幕| 97在线观看视频| 久久久久久久影院| 国产精品欧美风情| 国产精品网址在线| 国产精品盗摄久久久| 国产精品视频色| 亚洲老头同性xxxxx| 欧美自拍视频在线观看| 欧美国产日产韩国视频| 亚洲欧美综合精品久久成人| 国产日韩欧美电影在线观看| 欧美亚洲在线视频| 国产第一区电影| 91亚洲精品视频| 亚洲aⅴ男人的天堂在线观看| 久久在线免费观看视频| 欧美激情在线有限公司| 精品国产91乱高清在线观看| 中文字幕日韩精品在线| 韩国三级日本三级少妇99| 成人免费视频网址| 精品中文字幕在线2019| 日本午夜精品理论片a级appf发布| 亚洲精品日韩激情在线电影| 不卡av电影在线观看| 最新的欧美黄色| 久久91超碰青草是什么| 国产欧美在线视频| 久久久久久久久久婷婷| 中文字幕免费精品一区| 国产精品视频午夜| 欧美成人精品三级在线观看| 91亚洲永久免费精品| 国产亚洲综合久久| 久久网福利资源网站| 日本欧美在线视频| 国内精品在线一区| 欧美专区在线视频| 亚洲欧美成人一区二区在线电影| 亚洲第一二三四五区| 日韩精品丝袜在线| 国产精品午夜视频| 日韩中文字幕在线视频播放| 亚洲男女性事视频| 亚洲片国产一区一级在线观看| 国产精品一香蕉国产线看观看| 欧美性猛交xxxx偷拍洗澡| 69av成年福利视频| 亚洲男人天堂九九视频| 成人免费高清完整版在线观看| 精品爽片免费看久久| 色多多国产成人永久免费网站| 成人综合国产精品| 久久精品国产清自在天天线| 午夜精品久久久久久久99热| 亚洲精品91美女久久久久久久| 国产视频精品一区二区三区| 亚洲高清不卡av| 久久精品成人欧美大片古装| 911国产网站尤物在线观看| 久久噜噜噜精品国产亚洲综合| 国产欧美va欧美va香蕉在| 一区二区欧美在线| 国外视频精品毛片|