java中的"Stub"和"AIDL"是什么?

Amy*_*uGo 31 service android stub aidl

问题1:

我正在学习Android服务,经常看到这样的代码:

private ISampleService.Stub sampleServiceIf = new ISampleService.Stub(){}
Run Code Online (Sandbox Code Playgroud)

什么是.Stub

问题2:

我检查了" AIDL ",但我想知道为什么我们必须使用它而不是Java接口文件?

Nik*_*kov 33

'Stub'是一个实现远程接口的类,您可以像使用本地一样使用它.它处理数据编组/解组以及向/从远程服务发送/接收.术语"存根"通常用于在其他RPC方法(COM,Java远程处理等)中描述此功能,但它可能意味着略有不同.

IDL(接口定义语言)通常与语言无关,理论上您可以从中生成C++或Python存根代码.虽然Android是基于Java的,但区别是微妙的.一个区别是你只能在.aidl文件中有一个接口,而Java允许每个.java文件有多个类/接口.还有一些支持哪些类型的规则,因此它与Java接口不完全相同,并且您不能使用一个而不是AIDL.

  • 这些是一般概念。虽然您可能可以在 Android 中实现 AIDL 以外的其他东西,但它不会成为标准,因此您可以将 AIDL 视为唯一的标准 RPC 机制。 (2认同)

Har*_*ian 6

在 AIDL 文件中,可以使用远程服务的方法签名定义接口。AIDL 解析器从接口生成一个 Java 类,可用于两种不同的目的。

  1. 它生成一个Proxy类来让客户端访问服务,
  2. 它生成一个abstract Stub类,服务实现可以使用该类将其扩展为具有远程方法实现的匿名类。

    在此处输入图片说明

换句话说,

  • AIDL android项目编译完成后,ISampleSevice.java会为ISampleSevice.aidl文件生成java类。

  • 它将具有抽象 Stub 类和一个 Proxy 类。

  • 远程服务必须创建一个 Stub 类对象,并且在客户端调用 bindService() 时必须将其返回给客户端。

  • onBind()远程服务将返回一个stub类对象。

  • 在客户端onServiceConnected(),用户可以获得远程服务定义的存根的代理对象(ISampleService.Stub.asInterface()返回代理类)。

  • 代理对象可用于在服务进程中调用 Stub 类实现的远程方法。