web-dev-qa-db-fra.com

À quoi servent «Stub» et «AIDL» en Java?

Question 1:

J'étudie Android et je vois souvent du code comme celui-ci:

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

Quel est .Stub?

Question 2:

J'ai vérifié " AIDL ", mais je veux savoir pourquoi nous devons l'utiliser à la place du fichier d'interface Java Java?

32
AmyWuGo

'Stub' est une classe qui implémente l'interface distante de manière à ce que vous puissiez l'utiliser comme s'il s'agissait d'une interface locale. Il gère le marashalling/unmarshalling des données et l'envoi/la réception vers/depuis le service distant. Le terme 'stub' est généralement utilisé pour décrire cette fonctionnalité dans d'autres méthodes RPC (COM, Java remoting, etc.), mais il peut signifier des choses légèrement différentes.

L'IDL (Interface Definition Language) est généralement indépendant du langage, et vous pouvez théoriquement en générer du code stub C++ ou Python). Le Android on est basé sur Java cependant, la distinction est subtile. Une différence est que vous ne pouvez avoir qu'une seule interface dans un fichier .aidl, tandis que Java autorise plusieurs classes/interfaces par fichier .Java. règles pour quels types sont pris en charge, donc ce n'est pas exactement la même chose qu'une interface Java, et vous ne pouvez pas en utiliser une au lieu d'AIDL.

33
Nikolay Elenkov

Dans un fichier AIDL, une interface peut être définie avec les signatures de méthode du service distant. L'analyseur AIDL génère une classe Java à partir de l'interface, qui peut être utilisée à deux fins différentes.

  1. Il génère une classe Proxy pour donner au client l'accès au service,
  2. Il génère une classe abstractStub, qui peut être utilisée par l'implémentation de service pour l'étendre à une classe anonyme avec l'implémentation des méthodes distantes.

    enter image description here

En d'autres termes,

  • Lorsque le projet AIDL Android Android est compilé, alors Java class ISampleSevice.Java Doit être généré pour le fichier ISampleSevice.aidl).

  • Il aura une classe Stub abstraite et une classe Proxy.

  • Le service distant doit créer un objet de classe Stub, et le même doit être retourné au client lorsque le client appelle bindService ().

  • La onBind() du service distant doit renvoyer un objet de classe Stub.

  • Sur la onServiceConnected() du client, l'utilisateur peut obtenir l'objet proxy du stub défini sur le service distant (la ISampleService.Stub.asInterface() renvoie la classe proxy).

  • L'objet proxy peut être utilisé pour appeler les méthodes distantes de l'implémentation de la classe Stub lors du processus de service.

3
Hardian

Hé, veuillez vérifier cela http://developer.Android.com/guide/components/aidl.html . Cela vous aidera à comprendre le talon et l'AIDL.

1
PravinK