Лучший способ для службы, которая запускает активность, чтобы общаться с ним - PullRequest
6 голосов
/ 16 февраля 2010

У меня есть служба, которая слушает сокет. При получении определенного ввода это создать деятельность. При получении другого ввода, это убить это действие. Некоторое время я боролся за то, чтобы сервис связывался с активностью через AIDL (http://developer.android.com/guide/developing/tools/aidl.html),, но это, кажется, неэффективно. Я думаю, что AIDL эффективен только тогда, когда процесс, с которым нужно поговорить, является службой, не тогда, когда это занятие? Мне бы хотелось получить несколько указаний или предложений о том, как решить мою проблему.

Приветствия

1 Ответ

9 голосов
/ 16 февраля 2010

У меня есть служба, которая слушает разъем. При получении определенного ввода это создать деятельность.

Пожалуйста, сделайте это настраиваемым. Службы не должны начинать действия, за исключением очень необычных обстоятельств (например, сокет является SIP-соединением, и вы создаете VOIP-клиент). Появление активности прерывает пользователя во всем, что он делает.

При получении другого ввода, это убить эту деятельность.

Единственный сценарий, который я видел, когда это действительный шаблон, - это отключение экрана вызова, когда другая сторона вешает трубку. Если вы создаете VOIP-клиент, ваш предложенный шаблон должен быть в порядке, но в противном случае, пожалуйста, пересмотрите возможность исчезновения активности в середине пользователя, использующего его.

Я думаю, что AIDL эффективен только тогда, когда процесс, с которым нужно поговорить, услуга, а не когда это деятельность?

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

Я бы с удовольствием предложения о том, как решить мою проблема.

Вы не предоставили достаточно информации о характере общения, чтобы дать вам исчерпывающий ответ. Что именно служба пытается рассказать о деятельности? Деятельность также пытается связаться со службой?

Рекомендованным шаблоном для непрерывного обмена данными между деятельностью и службой является использование шаблона локальной привязки. Вы найдете пример этого в своих примерах SDK, и вы можете найти один здесь .

В этом случае у службы есть варианты для обратной связи с клиентом: с помощью обратного вызова (например, Handler в ответе, предоставленном г-ном Смильяничем) или посредством трансляции Intents. В случае обратного вызова действие должно быть привязано к сервису, чтобы получить доступ к API для предоставления объекта обратного вызова. Затем служба будет удерживать этот объект и вызывать методы во время ключевых событий.

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

...