这是一个非常开放式的问题,但让我尝试描述一下我如何看待应用程序内/间通信工作得最好。
Android 消息传递的关键方面之一是所有应用程序组件松散绑定的概念。由于所有应用程序都在单独的进程中运行,并且一个“应用程序”实际上可能由多个应用程序组成(负责提供不同的活动或服务),因此消息传递技术均基于跨进程边界编组消息的思想。
Intents
消息传递的首选技术是尽可能尝试使用 Intent。这是 Android 中最“原生”的消息传输方式。
优点
使用意图进行消息传递可以保持应用程序组件的松散绑定,使您可以在多个应用程序之间无缝传输消息。意图在核心系统中被大量使用来启动活动和服务,以及广播和接收系统事件。
使用 extras Bundles,您可以将基元的键/值对作为有效负载数据包含在 Intents 中,以便轻松地将信息从一个应用程序组件传递到另一个应用程序组件 - 即使这些组件在不同的进程中运行。
缺点
由于 Intent 被设计为在进程之间传递,因此额外负载仅支持原始类型。如果您需要使用 Intent 发送对象,则需要在一端将其解构为基元,并在另一端将其重建。
应用类
如果您只想在单个进程中运行的单个应用程序中进行通信,那么这是一个方便的解决方案。
优点
通过延长Application
类(并将其实现为单例),您将获得一个对象,只要任何应用程序组件存在,该对象就会存在,从而提供一个集中位置来存储和在应用程序组件之间传输复杂的对象数据。
缺点
此技术将您的消息传递限制为单个应用程序中的组件。
服务绑定、IPC 和 AIDL
绑定到服务使您可以访问其方法并与其交换对象。 AIDL 是一种定义如何将对象序列化为操作系统原语的方法,以便在您绑定到的服务在单独的应用程序中运行时可以跨进程边界对其进行编组。
优点
当您绑定到服务时,您可以访问它,就像它是调用类中的对象一样。这意味着您可以在服务上执行方法并与其交换丰富的对象。
请注意,如果您要绑定到不同应用程序进程中的服务,则需要创建 AIDL 定义来告诉 Android 如何序列化/反序列化您想要在应用程序之间传递的任何对象。
缺点
为 IPC 创建 AIDL 类需要一些额外的工作,并且绑定会在服务和活动之间创建额外的依赖关系,这会使内核在其他应用程序资源匮乏时更难以清理资源。
不过,跨进程边界编组消息的成本很高。因此,如果您不在服务上执行方法,那么使用绑定和 IPC 可能就有点过分了——看看您是否可以使用 Intents 实现同样的效果。
Sockets
如果您使用套接字在单个设备上运行的应用程序内部或之间进行通信,那么要么是因为没有其他方法,要么是您在某个地方错过了一个技巧。如果您的消息要离开设备,那么套接字是一个很好、快速的替代方案。如果您继续使用设备,则 Intents 或 IPC 可能是更好的选择。