34

问题一:

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

private ISampleService.Stub sampleServiceIf = new ISampleService.Stub(){}

是什么.Stub

问题2:

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

4

3 回答 3

36

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

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

于 2012-05-18T07:30:37.277 回答
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 类实现的远程方法。

于 2019-04-30T21:13:36.203 回答
1

嘿,请检查这个http://developer.android.com/guide/components/aidl.html。它将帮助您了解存根和 AIDL。

于 2012-05-18T09:04:27.143 回答