Подтвердить что ты не робот

Что такое "Stub" и "AIDL" для java?

Вопрос 1:

Я изучаю сервис Android и часто вижу такой код:

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

Что такое .Stub?

Вопрос 2:

Я проверил " AIDL ", но я хочу знать, почему мы должны использовать это вместо файла интерфейса Java?

4b9b3361

Ответ 1

'Stub' - это класс, который реализует удаленный интерфейс таким образом, что вы можете использовать его, как если бы он был локальным. Он обрабатывает марафонирование/разборку данных и отправку/получение в/из удаленной службы. Термин "заглушка" обычно используется для описания этой функции в других методах RPC (COM, Java remoting и т.д.), Но это может означать несколько разные вещи.

IDL (язык определения интерфейса), как правило, не зависит от языка, и вы могли бы теоретически генерировать код С++ или Python. Android один из них основан на Java, поэтому различие является тонким. Одно из отличий заключается в том, что вы можете иметь только один интерфейс в файле .aidl, тогда как Java допускает несколько классов/интерфейсов на один файл .java. Существуют также некоторые правила, для которых поддерживаются типы, поэтому он не совсем то же, что и интерфейс Java, и вы не можете использовать его вместо AIDL.

Ответ 3

В файле AIDL интерфейс может быть определен с помощью сигнатур методов удаленного сервиса. Парсер AIDL генерирует Java-класс из интерфейса, который может использоваться для двух разных целей.

  1. Он генерирует класс Proxy для предоставления клиенту доступа к сервису,
  2. Он генерирует abstract класс- Stub, который может использоваться реализацией службы для расширения его до анонимного класса с реализацией удаленных методов.

    enter image description here

Другими словами,

  • Когда андроида проект AIDL компилируется, то Java класс ISampleSevice.java должен быть сгенерирован для ISampleSevice.aidl файла.

  • Он будет иметь абстрактный класс Stub и класс Proxy.

  • Удаленная служба должна создать объект класса Stub, и тот же самый объект должен быть возвращен клиенту, когда клиент вызывает bindService().

  • onBind() удаленного сервиса должен возвращать объект класса Stub.

  • В клиенте onServiceConnected() пользователь может получить прокси-объект заглушки, определенный в удаленной службе (ISampleService.Stub.asInterface() возвращает прокси-класс).

  • Прокси-объект может использоваться для вызова удаленных методов реализации класса Stub в процессе обслуживания.