在Android开发中,相信你肯定听说过进程间通信。解决进程间的通信方式,相信你在面试的时候肯定能扯出几种方式:AIDL,Messenger,共享文件 .....blablablabla..... 但是 在Android开发的过程中很少使用到多进程吧。不常使用的东西,学会了过一段时间肯定会忘。正好,公司的一个新功能正好用到了多开一个进程,所以学习学习Messenger,记录一下。
憋的不说,直接上代码:
Service端的代码
public class MessengerService extends Service {
public final static String TAG = "MessengerService";
public final static int SERVICEID = 0x0001;
public final static int SERVICEID3 = 0x0003;
private Messenger messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.arg1 == SERVICEID){
//接收从客户端传来的消息
String str = (String) msg.getData().get("msg");
Log.d(TAG,"接收从客户端传来的消息");
Log.d(TAG,str);
//发送数据给客户端
Message msgTo = Message.obtain();
msgTo.arg1 = 0x0002;
Bundle bundle = new Bundle();
bundle.putString("msg","我来自服务器的字符串");
msgTo.setData(bundle);
try {
msg.replyTo.send(msgTo);
} catch (RemoteException e) {
e.printStackTrace();
}
}else if(msg.arg1 == SERVICEID3){
String str = (String) msg.getData().get("msg");
Log.e(TAG,str);
Message msgTo = Message.obtain();
msgTo.arg1 = 0x0002;
Bundle bundle = new Bundle();
bundle.putString("msg","hello!我叫小白@_@");
msgTo.setData(bundle);
try {
msg.replyTo.send(msgTo);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"service_onCreate");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"onBind");
return messenger.getBinder();
}
创建一个类,继承Service 并实现相应方法。创建一个Messenger对象,其中Handler作为一个参数,并且实现handleMessage方法。该方法主要是用于接收消息。
在onBind( )方法中,返回messenger.getBinder()。
Activity客户端的代码:
public class MainActivity extends AppCompatActivity {
private final static String TAG = "MainActivity";
public final static int ACTIVITYINFO = 0x0002;
/*
客户端的Messenger
*/
private Messenger aMessenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.arg1 == ACTIVITYINFO){
//客户端接收服务器端传来的消息
Log.d(TAG,"从服务端传来的消息");
String str = (String) msg.getData().get("msg");
Log.d(TAG,str);
}
}
});
/*
服务端传来的Messenger
*/
Messenger sMessenger;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.d(TAG,"onServiceConnected");
sMessenger = new Messenger(iBinder);
Message message = Message.obtain();
message.arg1 = 0x0001;
message.replyTo = aMessenger;
Bundle bundle = new Bundle();
bundle.putString("msg","我就是Activity传过来的字符串");
message.setData(bundle);
try {
//消息从客户端发出
sMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d(TAG,"onServiceDisconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService();
}
public void bindService(){
Intent service = new Intent(MainActivity.this,MessengerService.class);
bindService(service,serviceConnection, Context.BIND_AUTO_CREATE);
}
public void send(View view){
Message msg = Message.obtain();
msg.arg1 = 0x0003;
msg.replyTo = aMessenger;
Bundle bundle = new Bundle();
bundle.putString("msg","哈哈!!!我叫小明");
msg.setData(bundle);
try {
sMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
创建一个ServiceConnection对象,创建一个客户端的Messenger 和 一个服务器端的Messenger。
我们来捋一下代码运行的流程:
1.客户端绑定一个Service:
public void bindService(){
Intent service = new Intent(MainActivity.this,MessengerService.class);
bindService(service,serviceConnection, Context.BIND_AUTO_CREATE);
}
2.服务端执行onBind方法,返回messenger.getBinder():
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"onBind");
return messenger.getBinder();
}
3.客户端的onServiceConnected方法执行:
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.d(TAG,"onServiceConnected");
sMessenger = new Messenger(iBinder);
Message message = Message.obtain();
message.arg1 = 0x0001;
message.replyTo = aMessenger;
Bundle bundle = new Bundle();
bundle.putString("msg","我就是Activity传过来的字符串");
message.setData(bundle);
try {
//消息从客户端发出
sMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d(TAG,"onServiceDisconnected");
}
};
3.1 通过传来的参数,生成服务端的Messgener:
sMessenger = new Messenger(iBinder);
3.2 将客户端的Messenger也绑定在Message中,准备发送到服务端:
message.replyTo = aMessenger;
3.3 往服务端发送消息:
try {
//消息从客户端发出
sMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
4.服务端接收到消息并发送消息给客户端:
private Messenger messenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.arg1 == SERVICEID){
//接收从客户端传来的消息
String str = (String) msg.getData().get("msg");
Log.d(TAG,"接收从客户端传来的消息");
Log.d(TAG,str);
//发送数据给客户端
Message msgTo = Message.obtain();
msgTo.arg1 = 0x0002;
Bundle bundle = new Bundle();
bundle.putString("msg","我来自服务器的字符串");
msgTo.setData(bundle);
try {
msg.replyTo.send(msgTo);
} catch (RemoteException e) {
e.printStackTrace();
}
需要注意的一个点:发送消息给客户端使用的是msg.replyTo.send(...)。这里的msg.replyTo 和 客户端onServiceConnected方法中 绑定的 message.replyTo = aMessenger 是同一个Messenger。
5.客户端接收到消息:
/*
客户端的Messenger
*/
private Messenger aMessenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.arg1 == ACTIVITYINFO){
//客户端接收服务器端传来的消息
Log.d(TAG,"从服务端传来的消息");
String str = (String) msg.getData().get("msg");
Log.d(TAG,str);
}
}
});
从上面的步骤来看得到的结论:
(1)客户端的Messenger发送的信息,客户端的handleMessage()就能接收到,服务端的Messenger发送的信息,服务端的handleMessage()就能接收到。
(2)在客户端和服务端都实现handleMessage()方法用于接收自己Messenger发送的消息。
(3)在客户端中 服务端的Messenger是在onServiceConnected( )中创建的。 服务端中 客户端的Messenger是通过Message传过去的。 msg.replyTo = aMessenger