我使用Android
已经一年多了,但是我仍然很难决定什么时候应该在进程/线程之间使用不同类型的消息传递/通信。我主要讨论广播意图,使用services
的AIDL,使用处理程序发送消息和套接字通信。
这些工具中的许多都可以用来完成类似的任务,但是哪种工具更适合特定的情况?
发布于 2009-06-03 21:44:17
这是一个相当开放的问题,但让我试着描述一下我如何看待应用程序内/应用程序间通信的最佳工作方式。
Android消息传递的一个关键方面是所有应用程序组件都是松散绑定的概念。由于所有应用程序都在单独的进程中运行,并且一个“应用程序”实际上可能由几个应用程序(负责提供不同的活动或服务)组成,因此消息传递技术完全基于跨进程边界编组消息的思想。
意向
作为消息传递的首选技术,只要可能,总是尝试使用意图。这是在Android中传输消息的最“原生”方式。
优势
使用Intents进行消息传递维护了应用程序组件的松散绑定,使您可以在多个应用程序之间无缝地传输消息。意图在核心系统中大量使用,用于启动活动和服务,以及广播和接收系统事件。
使用extras Bundles,您可以将原语的键/值对作为意图中的有效负载数据,以便轻松地将信息从一个应用程序组件传递到另一个应用程序组件-即使这些组件运行在不同的进程中。
缺点
因为意图被设计为在进程之间传递,所以附加负载仅支持原语类型。如果您需要使用Intent发送对象,则需要在一端将其解构为原语,并在另一端重新构造它。
应用程序类
如果您只想在单个进程中运行的单个应用程序中进行通信,这是一个方便的解决方案。
优势
通过扩展Application
类(并将其实现为单例),您可以获得一个只要存在任何应用程序组件就会存在的对象,从而为在应用程序组件之间存储和传输复杂的对象数据提供了一个集中的位置。
缺点
此技术将消息传递限制到单个应用程序中的组件。
服务绑定、进程间通信和AIDL
绑定到服务允许您访问其方法并与其交换对象。AIDL是一种定义如何将对象序列化为操作系统原语的方法,以便在绑定到的服务在单独的应用程序中运行时,可以跨进程边界对其进行编组。
优势
当您绑定到服务时,您可以访问它,就像它是调用类中的对象一样。这意味着您可以在Service上执行方法,并与其交换富对象。
请注意,如果您绑定到不同应用程序进程中的服务,则需要创建AIDL定义,告诉Android如何序列化/反序列化您希望在应用程序之间传递的任何对象。
缺点
为IPC创建AIDL类是一项额外的工作,而绑定在服务和活动之间创建了额外的依赖关系,这可能会使内核在其他应用程序处于匮乏状态时更难清理资源。
不过,跨进程边界封送消息的代价很高。因此,如果你不是在服务上执行方法,使用绑定和IPC可能是大材小用--看看你是否可以使用Intents实现同样的事情。
套接字
如果你求助于套接字来在单个设备上运行的应用程序内部或之间进行通信,这要么是因为没有其他方式,要么是因为你错过了某个技巧。如果您的消息正在离开设备,那么套接字是一个很好的、快速的替代方案。如果你停留在设备上,很可能是有意的,或者IPC将是一个更好的选择。
发布于 2015-06-09 22:36:14
这完全取决于您的应用程序的用例和类型。如果应用程序一直在运行,最好使用AIDL方法,因为这是最安全的通信方式。如果应用程序不需要一直运行,那么您可以使用广播意图或挂起意图方法在应用程序之间进行通信。
发布于 2009-05-29 18:05:36
我的2分
https://stackoverflow.com/questions/922819
复制相似问题