Messenger可以被翻譯為信使氧腰,通過它可以在不同進程中傳遞Message對象诅福。在message中放入需要傳遞的數(shù)據(jù)泛范,就可以實現(xiàn)數(shù)據(jù)在進程中傳遞。Messenger是一種輕量級的IPC方案谍夭,底層實現(xiàn)還是AILD,具體見構(gòu)造方法黑滴。
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
一、對于Messenger的使用先從原理圖開始
二慧库、實現(xiàn)Messenger的具體步驟
服務端進程
服務端需要創(chuàng)新一個Server來處理客戶端的連接請求跷跪,同事創(chuàng)建一個Handler并通過它創(chuàng)建一個Messenger對象,然后在Server的onBind中返回Messenger底層的Binder即可齐板。客戶端進程
首先需要綁定服務吵瞻,連接成功之后使用服務端返回的IBinder對象創(chuàng)建一個Messenger對象,通過這個Messenger對象可以傳遞Message對象甘磨。
如果需要服務端回應客戶端橡羞,則需要向服務端一樣,創(chuàng)建一個Handler和一個由它構(gòu)造出來的Messenger济舆,并將這個Messenger對象通過Message.replyTo=Messenger
傳遞給服務端卿泽。之后服務端就可以獲取Message利用同樣的方法實例化一個Messenger,之后就可以給服務端傳遞信息滋觉,并由Handler處理签夭。代碼
服務端
public class MessengerService extends Service {
public static final String TAG = MessengerService.class.getSimpleName();
private final Messenger mMessenger = new Messenger(new MessengerHandler());
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
//獲取messenger的binder對象返回給客戶端使用
return mMessenger.getBinder();
}
public static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MyConstants.MSG_FROM_CLIENT:
Log.e(TAG, "來自客戶端的消息" + msg.getData().getString("msg"));
//給客戶端做出回應
Message message = Message.obtain(null, MyConstants.MSG_FROM_SERVER);
Bundle data = new Bundle();
data.putString("msg", "親!你已經(jīng)成功連上服務器了椎侠!");
message.setData(data);
try {
msg.replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
}
客戶端
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
private Messenger mServer, mClient;
private Intent mIntent;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//連接成功第租,使用服務端傳遞過來的Ibinder對象實例化messenger
mServer = new Messenger(service);
Message message = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "來自客戶端的消息");
message.setData(data);
//將客戶端的messenger傳遞給服務端,以便服務端響應客戶端
message.replyTo = mClient;
try {
mServer.send(message);
} 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);
mIntent = new Intent(this, MessengerService.class);
mClient = new Messenger(new MyHandler());
}
public void bindServer(View view) {
//綁定服務
bindService(mIntent, mServiceConnection, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection);
}
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//來自服務器的回應
case MyConstants.MSG_FROM_SERVER:
Log.e(TAG, "來自服務器的消息" + msg.getData().get("msg"));
break;
default:
super.handleMessage(msg);
}
}
}
}