Android多程式之Messenger的使用
Android多程式系列
- Android 多程式通訊之幾個基本問題
- Android多程式之Binder的使用
- Android多程式之手動編寫Binder類
- Android多程式之Binder解綁監聽的問題
- Android多程式之Binder的意外死亡及許可權校驗
Messenger也可以作為Android多程式的一種通訊方式,通過構建Message來在客戶端和服務端之間傳遞資料
簡單使用Messenger
客戶端通過Messenger向服務端程式傳送訊息
- 構建一個執行在獨立程式中的服務端Service:
public class MessengerService extends Service {
private static final String TAG = "MessagerService";
/**
* 處理來自客戶端的訊息,並用於構建Messenger
*/
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case MESSAGE_FROM_CLIENT:
Log.e(TAG, "receive message from client:" + message.getData().getString("msg"));
break;
default:
super.handleMessage(message);
break;
}
}
}
/**
* 構建Messenger物件
*/
private final Messenger mMessenger = new Messenger(new MessengerHandler());
@Nullable
@Override
public IBinder onBind(Intent intent) {
//將Messenger物件的Binder返回給客戶端
return mMessenger.getBinder();
}
}
- 註冊service,當然要設定在不同的程式
<service
android:name="com.xxq2dream.service.MessengerService"
android:process=":remote" />
- 然後客戶端是通過繫結服務端返回的binder來建立Messenger物件,並通過這個Messenger物件來向服務端傳送訊息
public class MessengerActivity extends AppCompatActivity {
private static final String TAG = "MessengerActivity";
private Messenger mService;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e(TAG, "ServiceConnection-->" + System.currentTimeMillis());
//通過服務端返回的Binder建立Messenger
mService = new Messenger(iBinder);
//建立訊息,通過Bundle傳遞資料
Message message = Message.obtain(null, MESSAGE_FROM_CLIENT);
Bundle bundle = new Bundle();
bundle.putString("msg", "hello service,this is client");
message.setData(bundle);
try {
//向服務端傳送訊息
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "onServiceDisconnected-->binder died");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
//繫結服務
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
//解綁服務
unbindService(mConnection);
super.onDestroy();
}
}
通過上面的額實踐,我們可以看出利用Messenger進行跨程式通訊,需要通過Message來傳遞訊息,而Message可以通過setData方法利用Bundle來傳遞複雜的資料。
服務端如果要回復訊息給客戶端,那就要用到Message的replyTo引數了
- 服務端改造
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case Constant.MESSAGE_FROM_CLIENT:
Log.e(TAG, "receive message from client:" + message.getData().getString("msg"));
//獲取客戶端傳遞過來的Messenger,通過這個Messenger回傳訊息給客戶端
Messenger client = message.replyTo;
//當然,回傳訊息還是要通過message
Message msg = Message.obtain(null, Constant.MESSAGE_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("msg", "hello client, I have received your message!");
msg.setData(bundle);
try {
client.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(message);
break;
}
}
}
- 客戶端改造,主要是通過Handle構建一個Messenger物件,並在向服務端傳送訊息的時候,通過Message的replyTo引數將Messenger物件傳遞給服務端
/**
* 用於構建客戶端的Messenger物件,並處理服務端的訊息
*/
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case Constant.MESSAGE_FROM_SERVICE:
Log.e(TAG, "receive message from service:" + message.getData().getString("msg"));
break;
default:
super.handleMessage(message);
break;
}
}
}
/**
* 客戶端Messenger物件
*/
private Messenger mClientMessenger = new Messenger(new MessengerHandler());
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e(TAG, "ServiceConnection-->" + System.currentTimeMillis());
mService = new Messenger(iBinder);
Message message = Message.obtain(null, MESSAGE_FROM_CLIENT);
Bundle bundle = new Bundle();
bundle.putString("msg", "hello service,this is client");
message.setData(bundle);
//將客戶端的Messenger物件傳遞給服務端
message.replyTo = mClientMessenger;
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "onServiceDisconnected-->binder died");
}
};
總結
- 使用Messager來傳遞Message,Message中能使用的欄位只有what、arg1、arg2、Bundle和replyTo,自定義的Parcelable物件無法通過object欄位來傳輸
- Message中的Bundle支援多種資料型別,replyTo欄位用於傳輸Messager物件,以便程式間相互通訊
- Messager以序列的方式處理客戶端發來的訊息,不適合有大量併發的請求
- Messager方法只能傳遞訊息,不能跨程式呼叫方法
歡迎關注我的微信公眾號,期待與你一起學習,一起交流,一起成長!
相關文章
- Android 多程式之Messenger的使用AndroidMessenger
- Android多程式之Binder的使用Android
- Android Messenger原理AndroidMessenger
- [Android]你不知道的Android程式化(5)--程式通訊Messenger框架AndroidMessenger框架
- android IPC 通訊(上)-sharedUserId&&MessengerAndroidMessenger
- Android 元件化之通訊(多模組,多程式)Android元件化
- Android多程式之Binder解綁監聽的問題Android
- Android中的多程式、多執行緒Android執行緒
- Android多程式通訊之幾個基本問題Android
- Android 多程式通訊之幾個基本問題Android
- Android之adb的使用Android
- Android多程式之Binder的意外死亡及許可權校驗Android
- Android 多程式通訊Android
- Android多媒體之Camera的相關操作Android
- Android 之Service使用攻略Android
- Android自定義View之Canvas的使用AndroidViewCanvas
- Android 程式之間通訊Android
- python使用多程式Python
- Android多媒體之Camera2的相關操作Android
- Android_Jetpack:Paging元件之BoundaryCallback的使用AndroidJetpack元件
- 使用者可在Messenger內讀書並與角色互動Messenger
- Android之串列埠程式設計Android串列埠程式設計
- Android多程式之手動編寫Binder類Android
- Android多媒體之SoundPool+pcm流的音訊操作Android音訊
- Android多執行緒之執行緒池Android執行緒
- react native之android多包共存解決方案React NativeAndroid
- Android Room2.0之@TypeConverters使用AndroidOOM
- Android Jetpack 之Navigation Architecture Component使用AndroidJetpackNavigation
- 程式碼安全之程式碼混淆及加固(Android)?Android
- Android進階知識樹——Android 多程式、Binder 你必須知道的一切Android
- 小程式之藍芽的使用藍芽
- Android 多媒體之 Silk 格式音訊解碼Android音訊
- Android 開發學習程式0.27 kotlin使用 和viewbinding的使用AndroidKotlinView
- 多apk釋出的Android程式的adb安裝——adb install-multipleAPKAndroid
- Q&Me:越南Facebook Messenger商品交易使用行為調查Messenger
- facebook instantgame iOS Messenger Bots交叉推廣的重要更新GAMiOSMessenger
- 畫江湖之 PHP 多程式開發 [建立一個新的程式]PHP
- 畫江湖之 PHP 多程式開發 【建立一個新的程式】PHP