Долгосрочный Android-сервис - PullRequest
       0

Долгосрочный Android-сервис

5 голосов
/ 13 ноября 2011

У меня есть приложение для Android, в котором Activity запускает долго выполняющиеся операции, которые выполняются в фоновом режиме.Эти операции взаимодействуют с Действиями после их завершения.Я разрабатываю компонент, который обрабатывает соединение Activity / Long-Running-Task, заботясь об уничтожении и воссоздании действий.

Сейчас этот компонент реализован как сервис Android.Действия вызывают bindService и используют полученный IBinder для запуска и отслеживания задач.Я решил не использовать startService, потому что я предпочитаю более богатый API, возможный через интерфейс Java.

Теперь проблема.Активность А запускается, связывается с сервисом и вызывает serviceApi.runTask (...).Затем действие A уничтожается (например, если пользователь переворачивает телефон) и воссоздается как действие A '.Затем A 'снова связывается со службой, объявляет о ее существовании, и все должно работать хорошо.

За исключением того, что моя Служба разрушена.Когда действие A уничтожено, оно открепляется от сервиса.Android видит, что клиентов больше нет, и убивает сервис.Когда действие A 'создается, сервис создается снова, и я теряю все, что было у старого сервиса.

Единственное решение, которое я вижу, - это использование для сервиса синглтона.И тогда это не обязательно должен быть сервис Android, просто экземпляр, доступный каждому.Это осуждается в Android?Есть ли лучший дизайн, который подходит для этой проблемы?


Отредактировано: даже если я вызываю startService и затем привязываюсь к нему, ничто не гарантирует, что экземпляр службы будет существовать, пока приложение работает.Android может убить липкие сервисы, если ресурсов мало.Уничтожение службы приведет к сбоям в работе приложения, а я этого не могу.

Ответы [ 3 ]

7 голосов
/ 14 ноября 2011

Даже если я вызову startService и затем свяжусь с ним, ничто не гарантирует, что экземпляр службы будет существовать до тех пор, пока приложение работает.

Правильно.

Android может убивать липкие сервисы, если ресурсов мало.

Также верно.Все «залипающие» средства означают, что Android может перезапустить службу.

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

Этоневозможно создать сервис, который гарантированно будет работать вечно.Для начала, пользователи могут избавиться от вашего сервиса, когда захотят, потому что пользователи ненавидят разработчиков, у которых бессмысленные сервисы работают вечно.Написание вечных услуг необходимо только в очень немногих случаях;в противном случае это просто неаккуратное программирование.

Единственное решение, которое я вижу, это использование синглтона для сервиса.И тогда это не обязательно должен быть сервис Android, просто экземпляр, доступный каждому.Это осуждается в Android?

Синглтоны (или члены-статические данные) исчезнут после завершения процесса.Процесс будет в конечном итоге завершен, особенно если нет активных служб и ни одно из ваших действий не находится на переднем плане.

1 голос
/ 13 ноября 2011

Вызовите startService и в onStartCommand верните START_STICKY.Служба должна работать.

Вы также можете посмотреть на службы переднего плана:

http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)

0 голосов
/ 13 ноября 2011

Вам нужно создать постоянный сервис. См. это руководство .

В двух словах - не звоните bindService, звоните startService.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...