АЙДЛ - В чем смысл?

Итак, у меня есть приложение для Android с активностью (пользовательский интерфейс) и службой (фоновый опрос). Они тесно связаны с помощью AIDL (включая обратные вызовы, так что это дуплексная связь, IPC и т. д.).

Каждый раз, когда они разговаривают, я использую это.

Однако я также расширил класс Application, чтобы они могли совместно использовать общие объекты данных. Таким образом, приложение содержит объект пользователя, который служба всегда использует, и действие также может получить к нему доступ, когда оно запущено.

Приложение также имеет WeakReference для действия (чтобы избежать утечек контекста), потому что пользователь иногда запускает обновления пользовательского интерфейса.

Так это выглядит

Activity (UI) ---> Application <--- Service

Я могу инициировать события пользовательского интерфейса в Сервисе, выполнив

_app = (FooApplication)this.getApplication();
FooActivity uiRef = _app.getUIReference().get();
if (uiRef != null) {
   uiRef.updateSomeDisplay();
}

Так что я не понимаю. Зачем возиться со сложными вызовами AIDL, когда я просто слабо ссылаюсь на пользовательский интерфейс, смотрю, существует ли он, и вызываю его методы.


person paulpooch    schedule 03.02.2011    source источник


Ответы (1)


Смысл AIDL в том, чтобы разрешить взаимодействие между процессами. Смысл службы в том, чтобы позволить фоновым операциям выполняться в отдельном процессе от вашего потока пользовательского интерфейса, чтобы они могли продолжать работать, даже если вы закроете приложение. Вам понадобится AIDL, потому что ваша служба будет работать в процессе, совершенно отличном от вашего пользовательского интерфейса, поэтому у вас не будет доступа к памяти в процессе пользовательского интерфейса из вашего процесса службы.

person Jason LeBrun    schedule 03.02.2011
comment
Понимаю. Я как бы собирал эту же мысль по кусочкам и вернулся, чтобы отредактировать сам. Если у меня есть отдельный процесс, не появится ли в Advanced Task Killer автономный служебный процесс? Это ограничивается перечислением видов деятельности? - person paulpooch; 03.02.2011
comment
Я работал с фоновыми службами в нескольких приложениях в течение последнего года на всех типах устройств от Android 2.1 до 4.1.2 и ни разу не видел, чтобы служба работала в отдельном процессе из пользовательского интерфейса, определенного в том же .apk. файл. В документации говорится, что если компонент приложения запускается и для этого приложения уже существует процесс (поскольку существует другой компонент из приложения), то компонент запускается в этом процессе и использует тот же поток выполнения. Да, вы можете сказать ему не делать этого, но я не вижу причин, по которым вы бы...? - person Jules; 01.03.2013
comment
Одним из примеров того, почему вы хотели бы сделать это, является служба фонового звука. Если вы запустите проигрыватель в отдельном процессе, ваше приложение медиаплеера может быть более эффективным с точки зрения использования памяти, поскольку весь стек пользовательского интерфейса не должен оставаться в памяти во время воспроизведения звука. Однако использование AIDL значительно усложняет работу, поэтому в большинстве случаев оно того не стоит. - person Jason LeBrun; 02.03.2013