原文地址:http://blog.csdn.net/xll712/article/details/50800698


  1. IPC简介

    IPC,即Inter-Process Communication进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。
    android中的IPC方式有很多种,以下是几个简单的对比:

    以上几种各有利弊,可能我们平时用的多的还是Bundle、文件共享、AIDL、ContentProvider这几种,对于Messenger这种方式很少用,而本章内容为了弥补这块的缺憾特写此贴,希望我们的知识又能扩展扩展,不好勿喷。

  2. Messenger

    Messenger可以翻译为信使,通过它可以在不同进程中传递Message对象,这时候可能会联想到咱们之前学的Handler对象,只不过Handler对象主要是进行线程间的数据通信的,而现在的Messenger则是进程间的通信的。

    Messenger是一种轻量级的IPC方案,它的底层实现是AIDL;它实际上是对AIDL的一种封装。

    下面是Messenger类的继承关系:

    Android中的IPC方式-Messenger --转载自肖老师博客160303_第1张图片

    使用Messenger与之前使用的Handler类似,同样分为服务端和客户端。

    • 服务端进程
      拿Service举例,需要创建一个Messenger对象,用于接收Activity中发送过来的消息,服务端代码如下:

publicclassMyServiceextendsService{privateMessengermessenger;privateHandlerhandler;@OverridepublicvoidonCreate(){//TODOAuto-generatedmethodstubsuper.onCreate();handler=newHandler(newHandler.Callback(){@OverridepublicbooleanhandleMessage(Messagemsg){//TODOAuto-generatedmethodstub//获取从Activity中发送过来的消息Bundlebundle=msg.getData();Stringstr=bundle.getString("msg");System.out.println("----->>"+str);//回执消息即服务器收到消息之后可以反向给客户端发送消息Messengerservi=msg.replyTo;//获得从客户端传过来的信使对象MessengerMessagereMsg=Message.obtain();Bundlebundle2=newBundle();bundle2.putString("msg","消息回来了");reMsg.setData(bundle2);try{servi.send(reMsg);//向Activity中发送回执消息}catch(RemoteExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnfalse;}});//通过Handler对象创建一个Messenger对象messenger=newMessenger(handler);}@OverridepublicIBinderonBind(Intentintent){//TODOAuto-generatedmethodstub//从Messenger对象中获取IBinder对象并返回returnmessenger.getBinder();}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546

备注:此处的replyTo主要是为了反向传输数据,即Service向ACtivity发送数据,Service中需要获得Activity创建的Messenger对象,用于消息的发送。

- 客户端进程
相当于绑定服务的Activity对象,首先需要绑定服务端的Service,成功后用服务端返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了。

publicclassMessengerActivityextendsActivity{privateMessengermessenger,replyMessenger;privateHandlerhandler;privateServiceConnectionconn=newServiceConnection(){@OverridepublicvoidonServiceDisconnected(ComponentNamename){//TODOAuto-generatedmethodstub}@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){//TODOAuto-generatedmethodstub//服务绑定成功之后通过返回的IBinder对象创建Messenger对象用于消息的发送messenger=newMessenger(service);}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_b);handler=newHandler(newHandler.Callback(){@OverridepublicbooleanhandleMessage(Messagemsg){//TODOAuto-generatedmethodstub//获取从Service中发送过来的数据Bundlebundle=msg.getData();Stringstr=bundle.getString("msg");System.out.println("======>>>>"+str);returnfalse;}});//创建一个Messenger对象用于接收从Service中发送过来的消息replyMessenger=newMessenger(handler);//启动服务采用的是bindService的方式Intentintent=newIntent(this,MyService.class);bindService(intent,conn,Context.BIND_AUTO_CREATE);}@OverrideprotectedvoidonDestroy(){//TODOAuto-generatedmethodstubsuper.onDestroy();//解绑服务对象unbindService(conn);}publicvoidonMyClick(Viewv){if(messenger!=null){//构建要发送的Message消息Messagemsg=Message.obtain();Bundlebundle=newBundle();bundle.putString("msg","helloword");msg.setData(bundle);msg.replyTo=replyMessenger;//如果想收到服务器向客户端发送过来的消息必须把回执类传递给服务类try{messenger.send(msg);//发送消息向存活在另一进程的service}catch(RemoteExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

总结上述代码的工作原理,如下图所示:

Android中的IPC方式-Messenger --转载自肖老师博客160303_第2张图片

注意:在AndroidManifest.xml文件中为了更能体现进程间的通信,可将Service注册为远程服务:即

<serviceandroid:name="com.example.exampledemo.MyService"android:process=":remote"></service>


更多相关文章

  1. 进程方法Android进程与线程基本知识
  2. Android系列之Intent传递对象的两种方法
  3. Android消息提示:AlertDialog、Toast、Notification的使用
  4. Android消息处理机制-Handler&Message概述与使用(含源码解析)
  5. Android studio插件GsonFormat,返回json快速创建实体对象
  6. 从源码解析-Android中进程间通信Binder机制之Linux基础 【一】
  7. Android进程与线程
  8. android多进程实验

随机推荐

  1. 关于greenDAO,看这篇文章就够了
  2. [置顶] Android中的DI(依赖注入)框架--Robo
  3. Android之Volley框架
  4. Android(安卓)Vendor Test Suite (VTS)
  5. React Native 项目运行在安卓模拟器Http
  6. Android(安卓)MediaPlayer 分析 - servic
  7. logcat日志
  8. Android(安卓)博客园客户端 (七)登录功能
  9. Android(安卓)Studio的使用第一篇优化篇
  10. Android资源文件命名规则