Как сделать, чтобы Android Обслужил, общаются с Действием

Я пишу свое первое приложение Android и пытаюсь получить голову вокруг коммуникации между услугами и операциями. У меня есть Сервис, который будет работать в фоновом режиме и делать некоторый gps и основанный на времени вход. У меня будет Действие, которое будет использоваться, чтобы запустить и остановить Сервис.

Таким образом, сначала я должен смочь выяснить, работает ли Услуга, когда Действие запускается. Существуют некоторые другие вопросы здесь об этом, таким образом, я думаю, что могу понять это (но не стесняться давать совет).

Моя настоящая проблема: если Действие работает, и Сервис запускается, мне нужен путь к Сервису для отправки сообщений в Действие. Простые строки и целые числа в этой точке - сообщения о состоянии главным образом. Сообщений не будет регулярно происходить, таким образом, я не буду думать, опрашивая сервис, хороший способ пойти, если существует иначе. Я только хочу эту коммуникацию, когда Действие было запущено пользователем - я не хочу запускать Действие с Сервиса. Другими словами, если Вы запустите Действие, и Услуга работает, то Вы будете видеть некоторые сообщения о состоянии в Действии UI, когда что-то интересное произойдет. Если Вы не запустите Действие, то Вы не будете видеть эти сообщения (они не настолько интересны).

Кажется, что я должен смочь определить, работает ли Услуга, и если так, добавьте Действие как слушателя. Затем удалите Действие как слушателя когда паузы Действия или остановки. Это на самом деле возможно? Единственным путем я могу выяснить, чтобы сделать это, должен иметь Действие, реализуют Parcelable и создают файл AIDL, таким образом, я могу передать его через удаленный интерфейс Сервиса. Это походит на излишество, хотя, и я понятия не имею, как Действие должно реализовать writeToParcel () / readFromParcel ().

Существует ли более легкий или лучший путь? Спасибо за любую справку.

Править:

Для любого, кто интересуется этим позже, существует пример кода от Google для обработки этого через AIDL в демонстрационном каталоге:/apis/app/RemoteService.java

242
задан peterh says reinstate Monica 2 January 2018 в 04:50
поделиться

1 ответ

Есть три очевидных способа связи со службами:

  1. Использование намерений
  2. Использование AIDL
  3. Использование самого объекта службы (как синглтона)

В вашем случае я бы выбрал вариант 3. Создайте статическую ссылку на саму службу и заполните ее в onCreate ():

void onCreate(Intent i) {
  sInstance = this;
}

Создайте статическую функцию MyService getInstance () , которая возвращает статический sInstance .

Затем в Activity.onCreate () вы запускаете службу, асинхронно ждете, пока служба действительно запустится (вы можете настроить службу, чтобы уведомить свое приложение о своей готовности, отправив намерение действия) и получить свой экземпляр. Когда у вас есть экземпляр, зарегистрируйте объект прослушивателя службы для службы, и все готово. ПРИМЕЧАНИЕ: при редактировании представлений внутри действия вы должны изменить их в потоке пользовательского интерфейса, служба, вероятно, будет запускать свой собственный поток, поэтому вам необходимо вызвать Activity.runOnUiThread () .

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

ПРИМЕЧАНИЕ. Этот метод полезен только тогда, когда ваше приложение / действие / задача - единственный процесс, который будет обращаться к вашей службе. Если это не так, вы должны использовать вариант 1. или 2.

88
ответ дан 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: