Что такое "Stub" и "AIDL" для java?
Вопрос 1:
Я изучаю сервис Android и часто вижу такой код:
private ISampleService.Stub sampleServiceIf = new ISampleService.Stub(){}
Что такое .Stub
?
Вопрос 2:
Я проверил " AIDL ", но я хочу знать, почему мы должны использовать это вместо файла интерфейса Java?
Ответы
Ответ 1
'Stub' - это класс, который реализует удаленный интерфейс таким образом, что вы можете использовать его, как если бы он был локальным. Он обрабатывает марафонирование/разборку данных и отправку/получение в/из удаленной службы. Термин "заглушка" обычно используется для описания этой функции в других методах RPC (COM, Java remoting и т.д.), Но это может означать несколько разные вещи.
IDL (язык определения интерфейса), как правило, не зависит от языка, и вы могли бы теоретически генерировать код С++ или Python. Android один из них основан на Java, поэтому различие является тонким. Одно из отличий заключается в том, что вы можете иметь только один интерфейс в файле .aidl, тогда как Java допускает несколько классов/интерфейсов на один файл .java. Существуют также некоторые правила, для которых поддерживаются типы, поэтому он не совсем то же, что и интерфейс Java, и вы не можете использовать его вместо AIDL.
Ответ 2
Эй, пожалуйста, проверьте http://developer.android.com/guide/components/aidl.html. Это поможет вам понять заглушку и AIDL.
Ответ 3
В файле AIDL интерфейс может быть определен с помощью сигнатур методов удаленного сервиса. Парсер AIDL генерирует Java-класс из интерфейса, который может использоваться для двух разных целей.
- Он генерирует класс
Proxy
для предоставления клиенту доступа к сервису, -
Он генерирует abstract
класс- Stub
, который может использоваться реализацией службы для расширения его до анонимного класса с реализацией удаленных методов.
![enter image description here]()
Другими словами,
-
Когда андроида проект AIDL компилируется, то Java класс ISampleSevice.java
должен быть сгенерирован для ISampleSevice.aidl
файла.
-
Он будет иметь абстрактный класс Stub и класс Proxy.
-
Удаленная служба должна создать объект класса Stub, и тот же самый объект должен быть возвращен клиенту, когда клиент вызывает bindService().
-
onBind()
удаленного сервиса должен возвращать объект класса Stub.
-
В клиенте onServiceConnected()
пользователь может получить прокси-объект заглушки, определенный в удаленной службе (ISampleService.Stub.asInterface()
возвращает прокси-класс).
-
Прокси-объект может использоваться для вызова удаленных методов реализации класса Stub в процессе обслуживания.