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 {@Overridepublic 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() {}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}}@Overridepublic void onServiceDisconnected(ComponentName name) {}};
如果启动service没有反应,请在AndroidManifest中添加queries。
<queries><package android:name="com.jn.testmessagerservice"/></queries>
运行如下