Messenger是基於AIDL實現的輕量級IPC方案。
1.使用
1.1服務端
接受信息的服務端需要實現一個Handler用於處理到的信息
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
Log.e(TAG, msg.getData().getString("msg"));;
default:
break;
}
}
}
然後用Messenger將Handler進行封裝
private final Messenger messenger = new Messenger(new MessengerHandler());
再通過onbinder函數返回messenger成員變量IMessenger的Binder,IMessenger實際上就是AIDL文件生成的接口,而Messenger對AIDL進行了封裝。
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
1.2客戶端
通過ServiceConnection類的onServiceConnected獲取到Binder,從而獲取到服務端的Messenger代理類,調用send函數發送Message。所以Messenger能發送的信息只有Message能攜帶的信息。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serverMessenger = new Messenger(service);
Message message = Message.obtain(null, MessengerService.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "I am from the client.");
message.setData(data);
try{
serverMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
1.3服務端返回客戶端信息
同樣是基於Messenger,客戶端同需要學要實現一個帶Handler的Messenger用於處理服務端返回的信息,而將客戶端的Messenger傳遞給服務端是通過 Message的replyTo字段實現的,public Messenger replyTo;
- 客戶端代碼
public class MessengerClient extends AppCompatActivity {
private static final String TAG = "MessengerClient";
public static final int FROM_SERVER = 1;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FROM_SERVER:
Log.e(TAG, msg.getData().getString("reply"));
break;
default:
break;
}
}
};
private Messenger clientMessenger = new Messenger(handler);
private Messenger serverMessenger;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serverMessenger = new Messenger(service);
Message message = Message.obtain(null, MessengerService.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "I am from the client.");
message.setData(data);
message.replyTo = clientMessenger;
try{
serverMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(connection);
super.onDestroy();
}
}
- 服務端代碼
package com.example.zhouk.testproject.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
public static final int MSG_FROM_CLIENT = 112;
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
Log.e(TAG, msg.getData().getString("msg"));
Messenger clientMessenger = msg.replyTo;
Message replyMessage = Message.obtain(null, MessengerClient.FROM_SERVER);
Bundle data = new Bundle();
data.putString("reply", "I am from the server");
replyMessage.setData(data);
try {
clientMessenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
private final Messenger messenger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}