为什么使用Messenger而不是将引用传递给Handler?

时间:2013-07-30 06:52:51

标签: android android-service android-handler

我有一个主要的活动和绑定服务。绑定服务从网络接收命令,该命令触发将消息发送到主活动中的处理程序。通过传递Handler对服务的引用,我得到了一切。然后......我偶然发现了一个名为Messenger的东西。

  

Messenger:对Handler的引用,其他人可以使用它来向其发送消息。这允许跨进程实现基于消息的通信,方法是在一个进程中创建指向处理程序的Messenger,并将该Messenger交给另一个进程。

这引发了一些问题:

  • 术语过程是否意味着我不需要使用Messenger,除非我 在Process and Thread下生成一个单独的流程 指引?
  • 使用Messenger总是好的做法吗?
  • 传递对Handler的引用通常是一个坏主意吗?

2 个答案:

答案 0 :(得分:9)

  

术语过程是否意味着我不需要使用Messenger,除非我   根据Process和Thread指南生成一个单独的流程?

这是对的。如果要绑定远程服务(例如,在另一个进程中运行),则需要Messenger。在这种情况下,为远程服务提供指向Handler的指针的唯一选择是使用Messenger

  

使用Messenger总是好的做法吗?

我不会这么说。在真正需要的时候使用它 - 对于远程服务或者如果你开始服务而不绑定它。您可以将Messenger作为额外内容打包到Intent并使用它启动服务。因此,您可以在不绑定服务的情况下将引用传递给Handler。这是Messenger有用的另一种情况。

  

传递对Handler的引用通常是一个坏主意吗?

如果您在活动开始和停止时正确处理Handler的注册和注销,那么您应该没问题。那么就没有必要使用Messenger进行本地服务。如果你没有正确注销处理程序,就会出现内存泄漏(服务引用处理程序,处理程序引用已停止的活动)。

答案 1 :(得分:0)

Messenger over handler的主要优点是,Messenger能够排队从各种客户端发送的所有消息。虽然Handler需要一个looper来做到这一点。因此,当在远程进程中的IPC中使用时,messenger给出了额外的优势