我应该何时使用Android的各种消息类型?

时间:2009-05-28 19:43:29

标签: android multithreading process messaging

我已经与Android一起工作了一年多,但我仍然无法确定何时应该使用进程/线程之间的不同类型的消息传递/通信。我主要讨论的是使用AIDL为services广播Intents,使用Handler发送消息和套接字通信。

这些工具中的许多工具可用于完成类似的任务,但哪种工具更适合特定情况?

4 个答案:

答案 0 :(得分:15)

这是一个非常开放的问题,但让我来描述一下我如何看待内部/内部应用程序通信最佳。

Android消息传递的一个关键方面是所有应用程序组件被松散绑定的概念。因为所有应用程序都在一个单独的进程中运行,并且一个“应用程序”实际上可能包含多个应用程序(负责提供不同的活动或服务),所以消息传递技术都基于跨进程边界封送消息的想法。

<强>意图

消息传递的首选技术,总是尽可能尝试使用Intent。这是在Android中传输邮件的最“原生”方式。

优点

使用Intents进行消息传递可以保持应用程序组件的松散绑定,使您可以在多个应用程序之间无缝地传输消息。在核心系统中大量使用意图来启动活动和服务,以及广播和接收系统事件。

使用extras Bundles,您可以将基元的键/值对包含在Intents中作为有效负载数据,以便轻松地将信息从一个应用程序组件传递到另一个应用程序组件 - 即使这些组件在不同的进程中运行。

缺点

因为Intents被设计为在进程之间进行,所以extras有效负载仅支持原始类型。如果你需要使用Intent发送一个对象,你需要在一端将它解构为基元并在另一端重构它。

申请类

如果您只想在单个进程中运行的单个应用程序内进行通信,这是一个方便的解决方案。

优点

通过扩展Application类(并将其作为Singleton实现),您将获得一个存在任何应用程序组件时将存在的对象,从而提供在应用程序组件之间存储和传输复杂对象数据的集中位置。

缺点

此技术将您的消息传递限制在单个应用程序中的组件。

服务绑定,IPC和AIDL

绑定到服务允许您访问其方法并与之交换对象。 AIDL是一种定义如何将对象序列化为OS原语的方法,以便在您绑定的服务在单独的应用程序中运行时,可以跨进程边界对其进行编组。

优点

绑定到服务时,您可以访问它,就好像它是调用类中的对象一样。这意味着您可以在服务上执行方法并与之交换丰富的对象。

请注意,如果您在不同的应用程序进程中绑定到服务,则需要创建AIDL定义,告诉Android如何对应用程序之间传递的任何对象进行seralize /反序列化。

缺点

为IPC创建AIDL类是一项额外的工作,绑定会在服务和活动之间创建额外的依赖关系,这会使内核在其他应用程序被饿死时更难以清理资源。

跨越流程边界的Marshelling消息很昂贵。因此,如果您没有在服务上执行方法,那么使用绑定和IPC可能有点过分 - 看看您是否可以使用Intents实现相同的功能。

<强>套接字

如果您正在使用套接字在单个设备上运行的应用程序内部或之间进行通信,那么要么就是因为没有其他方法,或者您错过了某个地方的技巧。如果您的消息正在离开设备,那么套接字是一个好的,快速的替代方案。如果你留在设备上,那么Intents或IPC将是一个更好的选择。

答案 1 :(得分:2)

这完全取决于您的应用程序的用例和种类。如果应用程序一直在运行,那么最好采用AIDL方法,因为它是最安全的通信方式。如果应用程序不需要一直运行,那么您可以使用广播意图或待定意图方法在应用程序之间进行通信。

答案 2 :(得分:1)

我的2美分

  • 我没有使用本地套接字。 因为必须,似乎有点矫枉过正 生成并解析数据。
  • 意图适用于任何事情 其他应用可能想要做(启动 我在一个撰写窗口或选择 出来的东西)
  • AIDL / Parcels / Handlers有一个 GUI与无头进程交谈 一直在运行。取决于 应用程序很多实际数据 使用内容可能会发生转移 提供者,但我倾向于有一些数据 需要转移到外面 那个频道。

答案 3 :(得分:0)

这是一篇很好的文章,我发现有助于找到Cocoa的NSUserDefaults类的替代品:

http://developer.android.com/guide/appendix/faq/framework.html