Service(二)使用Messenger

来源:互联网 发布:淘宝机器人自动回复 编辑:程序博客网 时间:2024/06/06 11:38

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方法:

@Overridepublic 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() {@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {// TODO Auto-generated method stubreceiveMessenger = 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();}}

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