android 多进程之 Messenger
2016-02-15 17:28
429 查看
使用Messenger可以实现多进程,跨应用之间的数据传递.这种数据传递的方式存在的特点是: 服务器一次只能处理一条数据,所以,服务端没有多进程并发访问所带来的问题.所以,此种方式多适用于进程间的简单通讯.
Messenger实现的具体思路是:
客户端通过动态的绑定绑定到了远程的服务器,
服务器会将实现定义好的信使传递到客户端,
客户端拿到了信使之后,可以将数据存入该信使,
然后再由该信使携带数据到服务器端.
再服务器端,事先已经定义好了该信使对应的处理器来处理消息.
这样就完成了客户端与服务器的单向通讯了.
如果要实现双方的通讯,客户端也可以定义自己的信使,然后将信使携带 到 服务器端,然后再由该信使携带数据到客户端.
感觉信使就像是两国外交的驻华大使或者驻美大使一样,原理差不多.
代码实现:
1 服务器端定义好信使与对应的处理器,并将信使传递到客户端.
2 客户端绑定服务器,拿到信使,然后传递数据.
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); } }
相关文章推荐
- Android RxJava学习
- Android图片的三级缓存和AsyncTask的使用的研究学习
- Android中通过代码获取arrays.xml文件中的数据
- Android Studio 安装出错 Failed to install Intel HAXM. For details, please check the installation log
- Android快速开发框架
- 使用git 发布android系统版本 1
- Android Studio的自带git插件的历史比较功能还不错
- Android 对齐唤醒是啥?
- Android Studio导入第三方类库的方法
- Android屏幕及view的截图
- Android color集锦
- moveTaskToBack Android应用退到后台,类似按下Home键
- Android MVP Demo
- Android - Socket 编程(WIFI 和 ADB)
- Android之Handler用法总结
- Android 5.0 Camera (5): take picture
- Android 5.0 Camera (6): record video
- 【Android开发】之MediaPlayer的错误分析
- Android 5.0 Camera (4): preview
- Android开发学习之路--Content Provider之初体验