2011-02-03 4 views
1

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

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

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

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

Так выглядит

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

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

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

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

ответ

0

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

+0

Я вижу. Я как бы собирал эту же мысль вместе и вернулся, чтобы отредактировать себя. Если у меня есть отдельный процесс - будет ли автономный процесс обслуживания не появляться в Advanced Task Killer? Это ограничивается листингом? – paulpooch

+0

Я работаю с фоновыми службами в нескольких приложениях за последний год на всех устройствах с Android 2.1 до 4.1.2 и ни разу не видел службу, запущенную в отдельном процессе, из пользовательского интерфейса, определенного в том же самом. файл apk. В документации говорится: «Если запускается компонент приложения и уже существует процесс для этого приложения (поскольку существует другой компонент из приложения), тогда компонент запускается в этом процессе и использует тот же поток выполнения». Да, ты * можешь * сказать это не делать этого, но я не вижу причин, почему ты ...? – Jules

+0

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