我一直与Android
远远超过一年了,但我仍然有麻烦的时候,确定不同类型的进程间通讯/通信/应使用线程。我主要谈论广播意图,使用AIDL的services
,使用处理程序发送消息和套接字通信。什么时候应该使用Android的各种不同消息类型?
许多工具可以用来完成类似任务,但更适合于特定的情况呢?
我一直与Android
远远超过一年了,但我仍然有麻烦的时候,确定不同类型的进程间通讯/通信/应使用线程。我主要谈论广播意图,使用AIDL的services
,使用处理程序发送消息和套接字通信。什么时候应该使用Android的各种不同消息类型?
许多工具可以用来完成类似任务,但更适合于特定的情况呢?
这是一个相当开放的问题,但让我试试看我如何看到最佳的内部/内部应用程序通信。
一个Android的消息的关键环节是所有应用程序组件是松散结合的概念。因为所有的应用程序在一个单独的进程中运行,而一个“应用”实际上可以由多个应用程序(负责提供不同的活动或服务),消息传递技术都是基于各地编组跨进程边界信息的想法。
意图
用于消息传递的优选技术,总是尽可能地尝试使用意图。这是在Android中传输消息的最“原生”方式。
优势
使用的消息意图维持应用程序组件的松散结合,让你几个应用程序之间无缝地传递消息。意图在核心系统中大量使用,以启动活动和服务,并广播和接收系统事件。
使用额外束可以包括图元的键/值对作为意图内的有效载荷数据来容易地从一个应用程序组件的信息传递到另一个 - 即使这些部件在不同的进程中运行。
缺点
因为意图的设计过程之间去,额外载荷只支持基本类型。如果您需要使用Intent发送对象,则需要将其解构为一端的基元,并在另一端重构它。
应用类
如果你只想在一个进程中运行,这是一个方便的解决方案单个应用程序内进行通信。
优势
通过扩展Application
类(和其实现为一个Singleton)你只要存在任何应用程序组件,这些组件将存在一个对象,提供对存储和传输的复杂对象数据集中的地方在应用组件之间。
缺点
这种技术限制了你的消息到组件的单个应用程序中。
服务绑定,IPC和AIDL
绑定到服务,您可以访问它的方法和交换对象吧。 AIDL是一种定义如何将对象序列化为OS原语的方法,以便在您绑定的服务正在单独的应用程序中运行时,它可以跨越流程边界进行编组。
优势
当您绑定到服务,您可以访问它,就好像它是调用的类内的对象。这意味着您可以在服务上执行方法并使用它交换丰富的对象。
请注意,如果您在不同的应用程序流程中绑定到服务,则需要创建AIDL定义,告诉Android如何对要在应用程序之间传递的任何对象进行seralize /反序列化。
缺点
创建AIDL类IPC是一些额外的工作,并结合创建服务和活动之间额外的依赖,可以使它更难为内核,以清理资源时其他应用程序正在饿死。
但是,跨越流程边界的编制邮件信息的代价很高。所以如果你不在一个服务上执行方法,使用绑定和IPC可能是矫枉过正的 - 看看你是否可以使用Intents实现同样的功能。
套接字
如果你诉诸插座内或在单个设备上运行的应用程序之间的沟通,有可能是因为没有其他办法,或者你已经错过了一次机会的地方。如果你的信息正在离开设备,那么插座是一个好的,快速的选择。如果你留在设备上,很可能是Intent或IPC将是更好的选择。
我的2美分
这是一个很好的文章我试图找到可可的类NSUserDefaults的替代发现的有用:
http://developer.android.com/guide/appendix/faq/framework.html
这一切都取决于你的应用程序的使用情况和种类。如果应用程序一直在更好地运行AIDL方法,因为它是最安全的通信方式。如果应用程序不需要一直运行,那么可以使用广播意图或等待意图方法在应用程序之间进行通信。
+1这是一个理想的答案,可以用作整个社区的标准答案..... – aProgrammer 2012-02-17 10:01:10