Service(二)使用Messenger

Messenger是信使的意思,将Messenger用于Service可以实现不同进程间的通信(IPC)

来看一下Messenger在此用到的主要方法:

1、构造方法 Messenger(Handler handler),其中的handler用于处理消息

2、Messenger.getBinder()返回一个Binder对象

3、Message.replyTo,这是message的一个成员变量,它可以指明一个Messenger对象,Messenger就像要飞往特定地方送信的信鸽,Message的replyTo指明了它要去的方向

4、Messenger.send(Message)发送信息

先来编写服务器端的代码,先写一个MyService(继承Service),里面有两个Messenger,一个用于收信一个用于送信

Messenger send_messenger;

Messenger receive_messenger = new Messenger(new Handler() {
	public void handleMessage(Message msg) {
                Bundle data = msg.getData();
                String s = data.getString("message");
                Toast.makeText(getApplicationContext(), "收到来自客户端的消息:"+s, Toast.LENGTH_SHORT).show();
                send_messenger = msg.replyTo;
                if(demo_1_messenger!=null) {
                	Message m = Message.obtain();
                	Bundle bundle = new Bundle();
                	bundle.putString("message", "你好呀,刚刚接收到了你的消息:"+s+"\n我觉得我有必要回复你一下,这样显得我比较有礼貌嘿!");
                	m.setData(bundle);
                	try {
				demo_1_messenger.send(m);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
                }
        }
}
重写onBind方法:

@Override
public IBinder onBind(Intent arg0) {
    return receive_messenger.getBinder();
}

第二步:写客户端代码,客户端中也是有两个Messenger,一个用于收信一个用于送信

Messenger receiveMessenger = new Messenger(new Handler() {
	public void handleMessage(Message msg) {
		String s = msg.getData().getString("message");
	};
});
然后可以把接收到的信息显示出来(略)

跟用IBinder实现一样,还是需要有一个ServiceConnection对象

ServiceConnection conn = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			receiveMessenger = new Messenger(arg1);
		}
	};

这里把IBinder类转换成了Messenger类,接着就用上面的方法处理onBind方法返回来的信息。

下面的代码是用于向服务器端发送信息:

Message msg = Message.obtain();
msg.what = 1;
msg.replyTo = clientMessenger;
Bundle bundle = new Bundle();
String s = et.getText().toString();  //获取EditText控件中的text,然后发送给服务器端
    if(s!=null) {
	bundle.putString("message", s);
	msg.setData(bundle);
	try {
		serverMessenger.send(msg);
	} catch (RemoteException e) {
		e.printStackTrace();
	}
}

绑定和解绑的步骤还是和以前一样。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值