4.3 使用 Messenger 實(shí)現(xiàn)進(jìn)程間通信
Messenger 是一種輕量級的IPC通信機(jī)制.底層使用的是AIDL機(jī)制.
Messenger 一次只處理一個請求因此不存在線程同步的問題.
Messenger傳遞的數(shù)據(jù)類型是 : Message 對象.
構(gòu)造方法:
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
實(shí)現(xiàn)Messenger的步驟 :
1, 服務(wù)端進(jìn)程
1, 創(chuàng)建一個Service來處理客戶端的請求.
2, 創(chuàng)建一個handler 用它來創(chuàng)建messenger對象.
3, 在Service的onBinder方法中返回這個Messenger底層的Binder對象即可.
2, 客戶端進(jìn)程
1, 綁定服務(wù)端的Service,綁定成功后用服務(wù)端返回的IBinder對象創(chuàng)建一個Messenger對象.
通過這個Messenger就可以向服務(wù)端發(fā)送消息了.發(fā)送消息的類型為message 對象.
2, 如果需要服務(wù)端回復(fù)客戶端就需要創(chuàng)建一個Handler,利用這個Handler 創(chuàng)建一個Messenger對象.
Messenger對象通過message 的 replyTo 參數(shù)傳遞給服務(wù)端.
3, 示例代碼
服務(wù)端關(guān)鍵代碼
/**
* 服務(wù)端進(jìn)程.
* Created by WSJ on 2016/9/29.
*/
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MyConstants.MSG_FROM_CLIENT :
Log.i(TAG,"rec from client : " + msg.getData().getString("msg"));
// 回復(fù)客戶端
Messenger messenger = msg.replyTo;
Message message = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);
Bundle data = new Bundle();
data.putString("msg","我已收到");
message.setData(data);
try {
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
// 返回Messenger底層的Binder對象.
return mMessenger.getBinder();
}
// 根據(jù)Handler創(chuàng)建Messenger
private final Messenger mMessenger = new Messenger(new MessengerHandler());
}
客戶端關(guān)鍵代碼
public class MessengerActivity extends AppCompatActivity {
private static final String TAG = "MessengerActivity";
/**
* 向服務(wù)端發(fā)送數(shù)據(jù)的Messenger
*/
private Messenger mService ;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 根據(jù)獲得Binder創(chuàng)建Messenger對象
mService = new Messenger(service);
Message msg = Message.obtain(null,MyConstants.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg","hello this is client !");
msg.setData(data);
// 將Messenger設(shè)置
msg.replyTo = mReplyMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MessengerActivity.this, MessengerService.class);
bindService(intent,mConnection,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mConnection);
super.onDestroy();
}
private Messenger mReplyMessenger = new Messenger(new MessengerReplyHandler());
/**
* 接收服務(wù)端響應(yīng)的Handler
*/
private static class MessengerReplyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MyConstants.MSG_FROM_SERVICE :
Log.i(TAG,"reply from server : " + msg.getData().get("msg"));
break;
default:
super.handleMessage(msg);
}
}
}
}
備注 : Android開發(fā)藝術(shù)探索