Android Messenger 进程间通信

来源:互联网 发布:网络语斯什么意思 编辑:程序博客网 时间:2024/05/16 11:10

一. 基本实现 

Messenger Class Overview

    Reference to a Handler, which others can use to send messages to it. This allows for the implementation of message-based communication across processes, by creating a Messenger pointing to a Handler in one process, and handing that Messenger to another process. 


   当Activities 和 Service 运行在不同的进程中时,如果不使用 AIDL ,如何实现它们的通信(IPC)呢?

要实现 Activity 和 Service 间的进程间通信,还可以用 Messenger 来实现,简要的步骤如下:

1. 在 Activity 中创建两个 Messenger 对象

(1)private Messenger mMessengerToService = null;

/**

  * 在连接到 Service 的时候,说明信使要给哪个具体 Service 送信

  */

 private ServiceConnection mConnection = new ServiceConnection() {

  @Override

  public void onServiceConnected(ComponentName name, IBinder service) {

   Log.i("Service", "onServiceConnected");

   // 指明这个 Messenger 对象绑定到哪个 service 上,即要向哪个 service 发消息

   mMessengerToService = new Messenger(service);

  }

  @Override

  public void onServiceDisconnected(ComponentName name) {

   mMessengerToService = null;

   Log.i("Service", "onServiceDisconnected");

  }

 };


(2)Messenger mMainMessenger = new Messenger(new MainActivityHandler());

// 指明这个 Messenger 要绑定到哪个 handler 上,别的进程可以通过这个 Messenger 的引用把消息丢到这个 Messenger

// 所绑定的 handler 对应的消息队列上,这样就实现进程间通信了

private final Messenger mMainMessenger = new Messenger(new MainActivityHandler());

@SuppressLint("HandlerLeak")

 class MainActivityHandler extends Handler {

  @Override

  public void handleMessage(Message msg) {

   Bundle bundle = new Bundle();

   bundle = msg.getData();

   textView.setText(bundle.getCharSequence("fromservice"));

   super.handleMessage(msg);

  }

 }

(3)在 activity 端,向 service 发消息时是这样进行的

      Bundle bundle = new Bundle();

      bundle.putString("fromActivity", "Lion send message from MainActivity to Service");

      Message msg = Message.obtain();

      msg.setData(bundle);

     

      // 在消息中加入 mActivityMessenger 的引用, Service 收到该消息后,

      // 就可以得到这个信使的引用了。因为 mActivityMessenger 关联到 MainActivity

      // 中的 Handler ,所以它能处理来自 Service 的消息

      msg.replyTo = mMainMessenger;

     

      // 让信使对象把信送出去

      mMessengerToService.send(msg);

2. service 端的实现逻辑和 activity 端是类似的 ...


二. 下面讨论 Activity 和 Service 的通信流程

    Activities 和 Service 运行在不同的线程中,它们依赖于不同的消息队列,即 Activities 依赖于 app 主线程的消息队列,而 Service 依赖于它自己的消息队列。在我的实现中,我把 Service 要发送给 Activities 的消息都丢到 app 的消息队列中,而所有 Activities 要发送给 Service 的消息自然都要丢到 Service 的消息队列中。Activity 要和 Service 通信前,必须要注册到 Service 上。每个 Activities 都可能要和 Service 进行通信,所以我为每个 Activities 都设置了两种信使对象:mActivityMessenger 和 mMessengerToService(都是 Messenger 类型)mActivityMessenger 绑定到主线程的消息队列上,mMessengerToService 的任务是把 Activity 要发送给 Service 的 message 给 send 到 Service 的消息队列上;而且在 message 中附加上 mActivityMessenger 的引用。这样当 Service 收到一个 message 时,它就知道是哪个 Activities 给它发的消息。同样的,在 Service 端也包含两个功能类似的信使对象:mServiceMessenger 和 mClientsMessengerList ,注意后者是一个 List 类型,它保存了当前注册到 Service 端的所有客户端的引用。这样 Service 就能把消息发给特定的客户端(即特定的 Activity)。两者的通信框架如下


    可以看到,在 activity 端,发给 service 的消息是由 mMessengerToService 发出去的,因为我们在构造这个对象的时候,让它绑定到 service 上了;而 service 发给 activity 的消息是由 mActivityMessenger 对象接收的,它收到消息后把消息丢到 activity 的消息队列中,因为我们在构造这个对象的时候就让它绑定到了 activity 的 handler 上了 ;在 service 端的逻辑也是一样的 。

  下面是这个 demo 的地址

http://download.csdn.net/detail/huanfengyun/8139825


0 0
原创粉丝点击