Android IPC機(jī)制(二)用Messenger進(jìn)行進(jìn)程間通信
Messenger可以在不同進(jìn)程中傳遞Message對象,我們在Message中加入我們想要傳的數(shù)據(jù)就可以在進(jìn)程間的進(jìn)行數(shù)據(jù)傳遞了。Messenger是一種輕量級的IPC方案并對AIDL 進(jìn)行了封裝,它實現(xiàn)起來比較容易,下面我們來看看如何實現(xiàn)。
首先我們先寫服務(wù)端(MessengerService.java),在onBind方法中創(chuàng)建Messenger,關(guān)聯(lián)接收消息的Handler調(diào)用getBinder來獲取Binder對象,在handleMessage方法中接收客戶端發(fā)來的信息。
服務(wù)端(MessengerService.java): 在handleMessage回調(diào)中收到客戶端信息時,我們調(diào)用Message.replyTo得到客戶端傳過來的Messenger對象,創(chuàng)建消息并通過Messenger發(fā)送給客戶端。
public class MessengerService extends Service {
public static final String TAG = "MoonMessenger";
public static final int MSG_FROMCLIENT=1000;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROMCLIENT:
Log.i(TAG,"服務(wù)端收到的信息-------"+msg.getData().get("msg"));
//得到客戶端傳來的Messenger對象
Messenger mMessenger=msg.replyTo;
Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);
Bundle mBundle=new Bundle();
mBundle.putString("rep","這里是服務(wù)端,我們收到信息了");
mMessage.setData(mBundle);
try {
mMessenger.send(mMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
};
@Override
public IBinder onBind(Intent intent) {
Messenger mMessenger=new Messenger(mHandler);
return mMessenger.getBinder();
}
}
客戶端(MessengerActivity.java),客戶端需要創(chuàng)建一個Handler來接收服務(wù)端的信息,前面我們在服務(wù)端調(diào)用Message.replyTo得到客戶端傳過來的Messenger對象,可是客戶端并沒有傳送Messenger對象啊,現(xiàn)在我們加上這段代碼將Messenger對象傳給服務(wù)端,當(dāng)然需要關(guān)聯(lián)我們定義的Handler。
public class MessengerActivity extends AppCompatActivity {
private Messenger mMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
Intent intent=new Intent(MessengerActivity.this,MessengerService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MessengerService.MSG_FROMCLIENT:
Log.i(MessengerService.TAG, "客戶端收到的信息-------" + msg.getData().get("rep"));
break;
}
}
};
private ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger=new Messenger(service);
Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);
Bundle mBundle=new Bundle();
mBundle.putString("msg", "這里是客戶端,收到了嘛服務(wù)端");
mMessage.setData(mBundle);
//將Messenger傳遞給服務(wù)端
mMessage.replyTo=new Messenger(mHandler);
try {
mMessenger.send(mMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection);
}
}
當(dāng)然別忘了注冊servce時要另開一個進(jìn)程:
<service android:name=".MessengerService" android:process=":remote"></service>
運(yùn)行代碼查看Log,大功告成。
浙公網(wǎng)安備 33010602011771號