android - 在 Android 上的应用程序之间通信的首选方式是什么(服务与 Intent )

标签 android service ipc aidl

Android上这两种应用交互方式有什么区别:

  1. 在应用 #1 中实现服务并在应用 #2 中使用它
  2. 处理 Intent 并发布 Intent 的答案。

交互应该是异步的。

各自的优缺点是什么?

最佳答案

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

  • 如果是“一般”请求(例如“选择照片”之类...),则它会为用户(和操作系统)提供选择最合适的应用程序的机会。您命名的应用程序 #2 实际上并不存在于目标用户的设备上(除非应用程序 #1 特别依赖它)。
  • 应用程序#2 真的可以花时间处理您提出的任何问题。如果它是以用户为中心的任务,那么它可能想要启动一个 Activity 并获取用户输入等。

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

另一方面,这并不是说您应该完全避免使用远程服务模型。它有许多有用的应用程序。这是我的解释变得有点“手摇”的地方,但希望您能理解我所说的要点。 AIDL 接口(interface)使您可以更直接地控制所调用的服务。不是启动一个 Intent , bundle 一堆数据,然后分派(dispatch)它,希望它能到达正确的服务(或 Activity ,或其他处理程序),然后以正确的方式处理,最终会返回一个结果对您来说,您直接调用 Remote 类中的方法。您在该远程类中调用的方法是由应用程序 #2 中编写的 AIDL 接口(interface)指定的方法(其功能类似于服务器)——但您很快就会开始考虑诸如线程之类的事情。您直接调用另一个进程中的代码 - 这意味着属于 App #1 的线程被授予访问 App #2 中的对象和方法的权限。

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

这种控制流有明显的优势,对我来说它感觉更像“API 风格”——但这并不是说它会适合每个人的目的。我的经验还表明,通过 AIDL 接口(interface)进行编程更容易出错且更脆弱。尽管从技术上讲,它总是按照您的指示去做,但很容易让它做错事——或者更糟的是,完全误解您告诉它的内容。我会说:在考虑编写 AIDL 服务之前先用尽其他途径。

关于异步调用的注意事项:

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

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

关于android - 在 Android 上的应用程序之间通信的首选方式是什么(服务与 Intent ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3699172/

相关文章:

android - 如何从 URI 中获取文件路径?

java - 2 个关于 RESTful Web 服务的问题

android - bindService强制关闭

java - python和java之间的IPC(进程间通信)

android - 在 Android 中使用 Volley 进行身份验证

java - 数据库到游标,游标到数组列表和数组列表到名称值对的字符串。

c - 如何在 C 中实现消息传递 IPC?

linux - 重新定义信号处理缺陷

java - 如何共享内部存储中的 mp3 文件?

android - 服务断点不起作用