14

我有一个主要活动和绑定服务。绑定的服务接收到来自网络的命令,该命令会触发向主活动中的 Handler 发送消息。通过将处理程序的引用传递给服务,我得到了一切工作。然后......我偶然发现了这个叫做Messenger的东西。

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

这启发了几个问题:

  • 流程一词是否意味着我不需要使用 Messenger,除非我根据流程和线程 指南生成单独的流程?
  • 使用 Messenger 总是好的习惯吗?
  • 传递对 Handler 的引用通常是个坏主意吗?
4

2 回答 2

10

流程一词是否意味着我不需要使用 Messenger,除非我根据流程和线程指南生成单独的流程?

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

使用 Messenger 总是好的习惯吗?

我不会这么说。在真正需要时使用它 - 用于远程服务或者如果您在没有绑定它的情况下启动服务。您可以将Messenger其作为附加组件打包Intent并使用它启动服务。Handler因此,您可以在不绑定服务的情况下传递对 a 的引用。Messenger这是有用的另一种情况。

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

如果您正确处理Handler活动开始和停止的注册和注销,那么您应该没问题。则无需Messenger用于本地服务。如果您没有正确注销处理程序,则会出现内存泄漏(服务引用处理程序,处理程序引用停止的活动)。

于 2013-08-19T08:20:11.893 回答
1

Messenger 相对于处理程序的主要优点是,Messenger 能够对从各种客户端发送的所有消息进行排队。而 Handler 需要一个 looper 来做到这一点。所以 messenger 在远程进程之间的 IPC 中使用时提供了额外的优势

于 2014-03-05T13:26:07.500 回答