Android上应用程序之间的这两种交互方式有什么区别:
- 在应用程序 #1 中实现服务并在应用程序 #2 中使用它
- 处理意图并发布意图的答案。
交互应该是异步的。
各自的优缺点是什么?
这实际上取决于您要实现的目标。在你问的情况下——交互应该是异步的,你没有理由不能使用 Intents。这种方式有两个好处:
如果您正在寻找此方法的更多技术优势:您不必担心每次更改接口时依赖生成的类代码的 App #1。当您使用 AIDL 编写接口时(这就是您实现您命名为“1”的服务模型的方式),ADT 将消失并为您生成一堆类,您可以使用它们来公开您的远程服务。当 App #1 的这些生成的类的版本与 App #2 不同时,就会出现问题。(相信我,与这些问题相关的错误消息信息量不足)。
另一方面,这并不是说您应该完全避免使用远程服务模型。它有许多有用的应用。这就是我的解释变得有点“摇摆不定”的地方,但希望你能理解我所说的要点。AIDL 接口使您可以更直接地控制所调用的服务。而不是启动一个意图,捆绑一堆数据,然后调度它,希望它能够到达正确的服务(或活动,或其他处理程序),然后以正确的方式处理,最终返回结果对您来说,您可以直接调用 Remote 类中的方法。您在该远程类中调用的方法是由在 App #2 中编写的 AIDL 接口指定的方法(其功能类似于服务器) - 但您很快就会开始考虑诸如线程之类的事情。您正在直接调用存在于另一个进程中的代码——这意味着属于 App #1 的线程被授予对 App #2 中对象和方法的访问权限。
您如何处理 App #1 在 App #2 中调用代码这一事实几乎取决于您,但我使用的方式(我相信推荐的方式,尽管如果有人知道不同,我希望他们能在这里纠正我)是在 App #2 中使用处理程序。当 App #1 调用 AIDL 接口时,它调用的代码会向 App #2 中的 Handler 发送消息,然后由 App #2 的线程调用 - 这意味着您知道应用程序的哪个部分正在访问哪些成员等等
这种控制流有明显的优势,对我来说它感觉更“API-ish”——但这并不是说它会适合每个人的目的。我的经验也是,通过 AIDL 接口进行编程更加容易出错和脆弱。尽管从技术上讲,它总是按照你告诉它做的事情做,但很容易让它做错事——或者更糟的是,完全误解了你告诉它的东西。我想说:在考虑编写 AIDL 服务之前,先用完其他路线。
关于异步调用的注意事项:
所以你有两个非常灵活的接口来在两个进程之间进行交互。两者都适用于不同的目的。