跨进程通信方式有很多,本文仅针对利用Messenger实现。
-
创建服务端
创建Messenger传入MessHander,在handleMessage方法中处理客户端发来的消息。发送消息到客户端通过messengerClient.sent()发送。
注意:服务端向客户端发消息必须用客户端的messenger.反之,客户端向服务端发消息必须用服务端的messenger
public class ReviceService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("ss", "onBind: ");
Messenger messengerService = new Messenger(new MessHander());
return messengerService.getBinder();
}
class MessHander extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 2: {
Bundle bundle = msg.getData();
String mess = bundle.getString("msg");
Log.i("ReviceService", "客户端发来的消息: " + mess);
Messenger messengerClient = msg.replyTo;
Message message = Message.obtain();
message.what = 1;
Bundle data = new Bundle();
data.putString("msg", "我是服务端发来的消息");
message.setData(data);
try {
messengerClient.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
}
-
创建客户端
客户端在onServiceConnected方法中可以获取到服务端的Messenger,首先通过IBinder拿到服务端的Messenger,然后发送消息到服务端。通过message.replyTo()将客户端的Messenger带到服务端。客户端接受服务端的消息在ClientHandle这个类中
class MessServiceConnect implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "onService已连接");
Messenger messengerService=new Messenger(service);
Message message=Message.obtain();
message.replyTo=messengerClient;
message.what=2;
Bundle data=new Bundle();
data.putString("msg","我是客户端发来的消息");
message.setData(data);
try {
messengerService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
class ClientHandle extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:{
Log.d("MessengerService", msg.getData().getString("msg"));
}
}
}
}
-
绑定服务
Intent intent=new Intent("android.intent.action.reviceService");
intent.setPackage("com.afscope.video");
MessServiceConnect conn = new MessServiceConnect();
bindService(intent, conn,BIND_AUTO_CREATE);