Messenger
Messenger是一種輕量級的IPC方案。適用於進程間通信,可以在不同進程中傳遞Message對象,在Message中放入需要傳遞的數據,就可以實現數據的進程間傳遞了。
使用步驟
首先創建MessengerService 繼承 Service,並創建MessengerHandler繼承Handler用於接收消息。
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
創建Messenger
private Messenger mMessenger = new Messenger(new MessengerHandler());
並在onBind()方法中將mMessenger.getBinder()返回。
Service當然要在AndroidManifest.xml文件中註冊,並單獨啓一個進程。
<service
android:name=".service.MessengerService"
android:process=":service">
</service>
接下來創建MessengerActivity和Service建立連接並開啓服務。
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//創建Messenger
Messenger messenger = new Messenger(service);
//創建Message
Message message = Message.obtain();
//標識
message.what = Constants.MSGCLIENT;
//創建Bundle
Bundle bundle = new Bundle();
//保存數據
bundle.putString("msg","你好啊,送你一朵小發發");
//賦值
message.setData(bundle);
try {
//發送數據
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private void initData() {
Intent intent = new Intent(this, MessengerService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mServiceConnection);
super.onDestroy();
}
然後修改MessengerService中的MessengerHandler 中對消息進行接收。
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constants.MSGCLIENT:
Log.e(TAG, "handleMessage: clientmessage"+msg.getData().getString("msg"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
運行程序即可看到發送給MessengerService的消息。
如果這個時候需要MessengerService對 MessengerActivity做出迴應怎麼處理呢。
在MessengerActivity中創建MessengerActivityHandler
private static class MessengerActivityHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
並創建mReplyMessenger
private Messenger mReplyMessenger = new Messenger(new MessengerActivityHandler ());
在給MessengerService發送消息的時候將mReplyMessenger 傳遞過去。
/**
* 重要 將mReplyMessenger給回去
*/
message.replyTo = mReplyMessenger;
MessengerService中處理
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constants.MSGCLIENT:
Log.e(TAG, "handleMessage: clientmessage"+msg.getData().getString("msg"));
//拿到Messenger對象
Messenger messenger = msg.replyTo;
//創建Message
Message replyMessage = Message.obtain();
//標識
replyMessage.what = Constants.MSGSERVICE;
//創建Bundle
Bundle bundle = new Bundle();
//保存數據
bundle.putString("reply","收到了你的消息,但我就是不想理你");
//賦值
replyMessage.setData(bundle);
try {
//發送數據
messenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
然後在MessengerActivity中對數據進行接收
private static class MessengerActivityHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constants.MSGSERVICE:
Log.e(TAG, "handleMessage: servicemessage"+msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
};
運行程序,如圖:
完整代碼
MessengerService
package com.example.test.service;
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.support.annotation.Nullable;
import android.util.Log;
import com.example.test.utils.Constants;
/**
* Description:
*/
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 Constants.MSGCLIENT:
Log.e(TAG, "handleMessage: clientmessage"+msg.getData().getString("msg"));
//拿到Messenger對象
Messenger messenger = msg.replyTo;
//創建Message
Message replyMessage = Message.obtain();
//標識
replyMessage.what = Constants.MSGSERVICE;
//創建Bundle
Bundle bundle = new Bundle();
//保存數據
bundle.putString("reply","收到了你的消息,但我就是不想理你");
//賦值
replyMessage.setData(bundle);
try {
//發送數據
messenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
private Messenger mMessenger = new Messenger(new MessengerHandler());
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
MessengerActivity
package com.example.test.process;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.example.test.R;
import com.example.test.service.MessengerService;
import com.example.test.utils.Constants;
/**
* messenger
*/
public class MessengerActivity extends AppCompatActivity {
private static final String TAG = "MessengerActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
initData();
}
private Messenger mReplyMessenger = new Messenger(new MessengerActivityHandler ());
private static class MessengerActivityHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case Constants.MSGSERVICE:
Log.e(TAG, "handleMessage: servicemessage"+msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
};
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//創建Messenger
Messenger messenger = new Messenger(service);
//創建Message
Message message = Message.obtain();
//標識
message.what = Constants.MSGCLIENT;
//創建Bundle
Bundle bundle = new Bundle();
//保存數據
bundle.putString("msg","你好啊,送你一朵小發發");
//賦值
message.setData(bundle);
/**
* 重要 將mReplyMessenger給回去
*/
message.replyTo = mReplyMessenger;
try {
//發送數據
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private void initData() {
Intent intent = new Intent(this, MessengerService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mServiceConnection);
super.onDestroy();
}
}