您的位置:首页 > 移动开发 > Android开发

android 多进程之 Messenger

2016-02-15 17:28 429 查看
使用Messenger可以实现多进程,跨应用之间的数据传递.这种数据传递的方式存在的特点是: 服务器一次只能处理一条数据,所以,服务端没有多进程并发访问所带来的问题.所以,此种方式多适用于进程间的简单通讯.

Messenger实现的具体思路是:

客户端通过动态的绑定绑定到了远程的服务器,

服务器会将实现定义好的信使传递到客户端,

客户端拿到了信使之后,可以将数据存入该信使,

然后再由该信使携带数据到服务器端.

再服务器端,事先已经定义好了该信使对应的处理器来处理消息.

这样就完成了客户端与服务器的单向通讯了.

如果要实现双方的通讯,客户端也可以定义自己的信使,然后将信使携带 到 服务器端,然后再由该信使携带数据到客户端.

感觉信使就像是两国外交的驻华大使或者驻美大使一样,原理差不多.

代码实现:

1 服务器端定义好信使与对应的处理器,并将信使传递到客户端.

public class MessagerService extends Service {

/**
* 处理客户端发送过来的消息
*/
private  Handler MessengerHandler=new Handler(){

public void handleMessage(android.os.Message msg) {
Bundle bunder=msg.getData();
String data=bunder.getString("msg");
Log.v("qin", "客户端的信息:"+data);

try {
Messenger messenger=msg.replyTo;
Message message=new Message();
Bundle bundle=new Bundle();
bunder.putString("reply","恩,我收到了你的消息");
message.setData(bundle);
messenger.send(message);

} catch (RemoteException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
};
};

private Messenger messenger=new Messenger(MessengerHandler);

@Override
public IBinder onBind(Intent intent) {
// TODO 自动生成的方法存根
return messenger.getBinder();
}

}


2 客户端绑定服务器,拿到信使,然后传递数据.

public class MessengerActivity extends Activity {

private Messenger messenger;

/**
* 处理服务器传递过来的消息
*/
private Handler mHandler=new Handler(){
public void handleMessage(Message msg) {
Bundle bundle=msg.getData();
String reply=bundle.getString("reply");
Log.v("qin", "服务端的回复:"+reply);
};
};

private Messenger clientMessenger=new Messenger(mHandler);

private  ServiceConnection conn=new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {

//将IBinder对象转换成信使
messenger=new Messenger(service);

Message msg=Message.obtain(null, 1);
Bundle bundle=new Bundle();
bundle.putString("msg", "你好,服务器.");
msg.setData(bundle);
//携带客户端的信使
msg.replyTo=clientMessenger;
try {
//发送到服务器端
messenger.send(msg);
} catch (RemoteException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
this.setContentView(R.layout.messengerlayout);

//动态绑定服务
Intent intent=new Intent(this,MessagerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

/**
* 解除绑定
*/
@Override
protected void onDestroy() {
// TODO 自动生成的方法存根
super.onDestroy();
unbindService(conn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: