Я пишу свое первое приложение Android и пытаюсь получить голову вокруг коммуникации между услугами и операциями. У меня есть Сервис, который будет работать в фоновом режиме и делать некоторый gps и основанный на времени вход. У меня будет Действие, которое будет использоваться, чтобы запустить и остановить Сервис.
Таким образом, сначала я должен смочь выяснить, работает ли Услуга, когда Действие запускается. Существуют некоторые другие вопросы здесь об этом, таким образом, я думаю, что могу понять это (но не стесняться давать совет).
Моя настоящая проблема: если Действие работает, и Сервис запускается, мне нужен путь к Сервису для отправки сообщений в Действие. Простые строки и целые числа в этой точке - сообщения о состоянии главным образом. Сообщений не будет регулярно происходить, таким образом, я не буду думать, опрашивая сервис, хороший способ пойти, если существует иначе. Я только хочу эту коммуникацию, когда Действие было запущено пользователем - я не хочу запускать Действие с Сервиса. Другими словами, если Вы запустите Действие, и Услуга работает, то Вы будете видеть некоторые сообщения о состоянии в Действии UI, когда что-то интересное произойдет. Если Вы не запустите Действие, то Вы не будете видеть эти сообщения (они не настолько интересны).
Кажется, что я должен смочь определить, работает ли Услуга, и если так, добавьте Действие как слушателя. Затем удалите Действие как слушателя когда паузы Действия или остановки. Это на самом деле возможно? Единственным путем я могу выяснить, чтобы сделать это, должен иметь Действие, реализуют Parcelable и создают файл AIDL, таким образом, я могу передать его через удаленный интерфейс Сервиса. Это походит на излишество, хотя, и я понятия не имею, как Действие должно реализовать writeToParcel () / readFromParcel ().
Существует ли более легкий или лучший путь? Спасибо за любую справку.
Править:
Для любого, кто интересуется этим позже, существует пример кода от Google для обработки этого через AIDL в демонстрационном каталоге:/apis/app/RemoteService.java
Есть три очевидных способа связи со службами:
В вашем случае я бы выбрал вариант 3. Создайте статическую ссылку на саму службу и заполните ее в onCreate ():
void onCreate(Intent i) {
sInstance = this;
}
Создайте статическую функцию MyService getInstance ()
, которая возвращает статический sInstance
.
Затем в Activity.onCreate ()
вы запускаете службу, асинхронно ждете, пока служба действительно запустится (вы можете настроить службу, чтобы уведомить свое приложение о своей готовности, отправив намерение действия) и получить свой экземпляр. Когда у вас есть экземпляр, зарегистрируйте объект прослушивателя службы для службы, и все готово. ПРИМЕЧАНИЕ: при редактировании представлений внутри действия вы должны изменить их в потоке пользовательского интерфейса, служба, вероятно, будет запускать свой собственный поток, поэтому вам необходимо вызвать Activity.runOnUiThread ()
.
Последнее, что вам нужно сделать, это удалить ссылку на ваш объект прослушивателя в Activity.onPause ()
, иначе экземпляр вашего контекста активности будет протекать, что нехорошо.
ПРИМЕЧАНИЕ. Этот метод полезен только тогда, когда ваше приложение / действие / задача - единственный процесс, который будет обращаться к вашей службе. Если это не так, вы должны использовать вариант 1. или 2.