java中的“Stub”和“AIDL”是什么?

时间:2012-05-18 07:14:47

标签: android service stub aidl

问题1:

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

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

什么是.Stub

问题2:

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

3 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

    https://chromedriver.storage.googleapis.com/index.html?path=74.0.3729.6/

换句话说,

  • 当编译AIDL android项目时,将为ISampleSevice.java文件生成Java类ISampleSevice.aidl

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

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

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

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

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