在Android上的应用程序之间进行通信的首选方式是什么(服务与意图)

时间:2010-09-13 09:30:07

标签: android service ipc aidl

Android上的这两种交互方式之间有什么区别:

  1. 在app#1中实施服务并在app#2中使用
  2. 处理意图并发布意图的答案。
  3. 交互应该是异步的。

    每个人的利弊是什么?

1 个答案:

答案 0 :(得分:6)

这实际上取决于你想要实现的目标。在你问的情况下 - 交互应该是异步的,你没有理由不使用Intents。这种方式有两个好处:

  • 如果这是“一般”请求(类似“挑选照片”等等),那么它会为用户(和操作系统)提供选择最合适的应用程序的机会。你命名的App#2实际上并不存在于目标用户的设备上是非常可行的(除非App#1特别依赖它)。
  • App#2可以把时间花在你所问的任何事情上。如果它是以用户为中心的任务,那么它可能想要启动一个Activity并获得用户输入等。

如果您正在寻找此方法的更多技术优势:每次更改界面时,您都不必担心App#1,具体取决于生成的类代码。当您使用AIDL编写接口时(这是您实现名为“1”的服务模型的方式),ADT将消失并为您生成一组用于公开远程服务的类。当App#1将这些生成的类的不同版本添加到App#2时会出现问题。 (相信你,与这些问题相关的错误信息不足以提供信息)。

另一方面,这并不是说你应该完全避开远程服务模式;它有许多有用的应用程序。这是我的解释变得有点“手工波浪”的地方,但希望你能理解我所说的要点。 AIDL接口使您可以更直接地控制您正在呼叫的服务。而不是启动意图,捆绑一堆数据,并希望它将到达正确的服务(或活动,或其他处理程序),然后以正确的方式处理,最终结果将返回对你来说,你直接调用Remote类中的方法。您在该远程类中调用的方法是由App#2中编写的AIDL接口指定的方法(其功能类似于服务器) - 但您很快就会开始考虑线程之类的东西。您直接调用另一个进程中的代码 - 这意味着属于App#1的线程可以访问App#2中的对象和方法。

你如何处理App#1在App#2中调用代码的事实在很大程度上取决于你,但我使用的方式(我相信推荐的方式,尽管如果有人知道不同我希望他们会纠正我在这里)是在App#2中使用Handler。当App#1调用AIDL接口时,它调用的代码会向生活在App#2中的Handler发送一条消息,然后由属于App#2的线程调用 - 这意味着您知道应用的哪个部分正在访问哪些成员等

这种控制流程有明显的优势,对我来说它感觉更“API-ish” - 但这并不是说它适合每个人的目的。我的经验也是通过AIDL接口进行编程更加错误和脆弱。虽然从技术上讲,它总是按照你告诉它做的,但很容易告诉它做错事 - 或者更糟糕的是,误解了你完全告诉它的事情。我会说:在考虑编写AIDL服务之前,先用尽其他路线。

关于异步调用的说明:

  • 如果您只是直接在App#2中调用代码,则它完全同步。
  • 如果您使用消息处理界面,情况就会有所不同。然后,您可以在App#1中提供第二个AIDL接口,允许App#2为您提供回调(这是Android官方AIDL文档中的示例)。

所以你有两个非常灵活的接口可以在两个进程之间进行交互。两者都有不同的用途。