Messenger有两个构造方法。
Messenger recevierMessenger = new Messenger(IBinder target);
Messenger recevierMessenger = new Messenger(Handler target);
能传handler和ibinder,
服务端进程
com.jn.testmessagerservice
创建一个service来处理客户端的链接请求,创建一个handler、一个messenger,然后在Service的onBind中返回这个Messager对象的binder。使用客户端的Messager来回复信息。
public class MessengerService extends Service {
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
Bundle bundle = msg.getData();
String content = bundle.getString("content");
Log.d("handleMessage", content);
//回复消息
Messenger messenger1 = msg.replyTo;
Message message = Message.obtain();
message.what = 2;
Bundle replyBundle = new Bundle();
replyBundle.putString("content","服务端发给客户端!!!!");
message.setData(bundle);
try {
messenger1.send(message);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
}
}
private final Messenger messenger = new Messenger(new MessengerHandler());
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
客户端
com.jn.testmessengerclient
启动service来发送客户端的信息,接收服务端的信息
启动service
Intent intent = new Intent();
intent.setClassName("com.jn.testmessagerservice", "com.jn.testmessagerservice.MessengerService");
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
发送消息,处理消息
/**
* 接受服务端的信息
*/
private Handler recevierHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
Bundle bundle = msg.getData();
String content = bundle.getString("content");
Log.d("recevice", "从服务器接收的参数:" + content);
return false;
}
});
/**
* 让Message持有Messenger进行传输,方便服务端发送消息
*/
private Messenger recevierMessenger = new Messenger(recevierHandler);
private Messenger messenger;
private final ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
Message msg = Message.obtain();
msg.what = 1;
msg.replyTo = recevierMessenger;//服务端回复消息使用
Bundle bundle = new Bundle();
bundle.putString("content", "客户发送数据");
msg.setData(bundle);
try {
messenger.send(msg);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
如果启动service没有反应,请在AndroidManifest中添加queries。
<queries>
<package android:name="com.jn.testmessagerservice"/>
</queries>
运行如下