AIDL使用示例

60
为了理解Android中的AIDL,我需要一个现实中的例子,即在开发的什么场景下需要使用AIDL。
通过阅读Android文档...它让我感到困惑和产生了很多问题,所以对于我来说阅读整个文档是很困难的,有人可以帮助我吗?
1. AIDL是用于与手机外部通信还是与不同的应用程序通信?(为什么我们需要与其他应用程序通信) 2. 文档中所提到的服务是什么类型的服务?请解释一下。
5个回答

48

AIDL用于Binder。Binder是在Android Service上执行RPC调用的机制。

何时使用AIDL?当需要服务时。什么时候需要服务?如果您想共享数据并且在另一个应用程序中控制某些内容,则需要使用AIDL作为接口的服务。(仅共享数据时使用Content Provider)。

服务可以在应用程序内部使用,作为MVC模式中的模型卷。


好的,现在我明白了,谢谢,比如说,如果我想控制Android内置的电话拨号器,或者在需要跟踪手机上所有其他应用程序的情况下,我需要使用AIDL……如果我理解有误,请纠正我。 - Nixit Patel
2
这要看情况。有些信息(如联系人)可以通过内容提供者获得。您可以将内容提供者视为共享特定数据的持久数据存储。AIDL /服务/绑定用于通信。我的意思是,不仅共享数据,还与其他组件进行交互。使用AIDL可以进行电话控制。 - Jordi
它还用于从服务中获取回调到任何活动。 - dharmendra

31

AIDL是Android接口定义语言,可以进行IPC调用。

用途:某些情况下一个进程需要与另一个进程通信以获取特定信息。

例如:进程A 需要呼叫状态的信息来确定是否需要更改呼叫类型(例如从音频呼叫到视频呼叫或反之亦然)。您可以从某些监听器中获取呼叫状态,但要从音频呼叫更改为视频呼叫,进程A 需要更改的方式。这种“钩子”或更改呼叫的方法通常是电信类的一部分,这些类是电信进程的一部分。因此,为了从电信进程获取这样的信息,您可以编写一个 电信服务 (作为Android电信进程的一部分运行),它将允许您查询或更改呼叫类型。由于此处的进程A(客户端)正在使用与电信进程通信以更改呼叫类型的远程服务,因此需要有一个接口来与服务进行通信。由于电信服务是提供者,进程A(客户端)是用户,因此它们都需要同意一个它们可以理解和遵循的接口(协议)。这种接口就是AIDL,它允许您通过远程服务与电信进程进行通信,并完成一些工作。

简单来说,AIDL是客户端获得的“协议”,告诉它如何与服务进行通信。服务本身将拥有该协议的副本(因为它是为其客户发布的)。一旦请求到达或者有人在与服务交互时,服务将实现详细信息并处理它。

因此,进程A通过服务请求更改呼叫,服务收到请求后,与电信进程进行通信(因为它是其中的一部分)并将呼叫更改为视频呼叫。

需要注意的一个重要点是,只有在多线程环境下才需要使用AIDL。如果不需要处理多线程结构,则可以不使用Binder。


很好的解释。 - Muhammad Maqsood

4
另一个现实世界的例子是Google Play许可证使用AIDL。

1
我对 AIDL 的示例有同样的想法,很难找到一个使用 AIDL 的示例应用程序的创意。然后我有了一个想法,创建一个 LocalLogServerApp。也许它不能成为一个生产应用程序,但它仍然展示了使用 AIDL 的一些价值。
这个应用程序的主要功能是:
- 接收来自其他本地应用程序(另一个应用程序需要实现 AIDL 来发送日志)的本地日志 - 将日志保存到数据存储中 - 显示日志 - 可能对本地日志执行某些操作(例如:搜索、删除) - 可能在发生错误日志时通知开发人员
这个应用程序的好处是:
- 当您遇到一些非常奇怪的问题,这些问题有时会在几个瞬间和某些特定设备上发生时,可以使用本地日志。在这种情况下,普通的日志无法帮助,调试也无法帮助,Firebase Log 可能有所帮助,但 Firebase 会接收来自多个设备的日志。 - 可重用,许多应用程序可以使用它,代码更少。
希望这个想法能帮助你找到另一个更好的AIDL示例。 https://github.com/PhanVanLinh/AndroidLocalLogServer https://github.com/PhanVanLinh/AndroidLocalLogClientTest

0

1 - 它是用于与手机外部通信吗? 它是用于与应用程序外部通信。

2 - 还是用于与不同的应用程序通信,(为什么我们需要与其他应用程序通信) 正如@GodOnScooter所提到的,当您的应用程序与电话服务通信时,实际上是与另一个部分通信。

3 - 文档中他们在谈论什么样的服务?

这是在系统的不同进程中运行的服务,要绑定到此服务,您需要使用IPC(进程间通信),AIDL用于实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接