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

use*_*946 5 messaging multithreading android process

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

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

Ret*_*ier 16

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

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

意图

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

好处

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

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

缺点

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

应用类

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

好处

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

缺点

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

服务绑定,IPC和AIDL

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

好处

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

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

缺点

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

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

套接字

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