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

1 service android ipc aidl

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

  1. 在app#1中实现服务并在app#2中使用它
  2. 处理意图并发布意图的答案.

交互应该是异步的.

什么是各自的利弊?

jel*_*ord 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文档中的示例).

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