Какие варианты у меня есть для проверки того, запущен ли уже IntentService?

У меня есть AlarmService, который просыпается каждые 15 минут и запускает IntentService. Тем не менее, я хотел бы убедиться, что если ранее запущенная IS уже запущена, то AlarmService не попытается запустить другую (IS работает с файлами, и будет странное состояние гонки, если вторая версия попытается действуют на одни и те же файлы).

Каков наилучший способ опросить систему, чтобы узнать, запущен ли экземпляр моей IS, и просто пропустить текущую итерацию хрона AlarmService?


person Yevgeny Simkin    schedule 25.02.2011    source источник


Ответы (1)


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

Гоночных условий не будет. Во-первых, всегда будет только один экземпляр IntentService. Во-вторых, IntentService будет обрабатывать только один Intent за раз в onHandleIntent().

Каков наилучший способ опросить систему, чтобы узнать, запущен ли экземпляр моей IS, и просто пропустить текущую итерацию хрона AlarmService?

Не делай так. В своем IntentService отследите, когда вы в последний раз работали с элементом данных. Если в onHandleIntent() это значение равно null, это ваш первый проход через какое-то время, и поэтому вы, вероятно, захотите продолжить работу. Если значение не null, сравните его с текущим временем, а если слишком рано, просто вернитесь из onHandleIntent().

person CommonsWare    schedule 26.02.2011
comment
Я не уверен, что понимаю, но позвольте мне описать точную природу моего беспокойства. InterntService занимается загрузкой файлов на сервер. Существует клиентское приложение, в котором делаются снимки, но устройство, скорее всего, находится в месте, где 3G-соединение равно 0. Таким образом, идея состоит в том, чтобы разгружать изображения, когда это возможно. В моем дизайне будильник срабатывает каждые 15 минут и вызывает Intent, который просматривает папку, в которой находятся изображения, и, если находит, пытается их загрузить. Однако их загрузка может занять более 15 минут, и в это время - person Yevgeny Simkin; 27.02.2011
comment
Alarm разбудит Intent, и он может увидеть те же файлы и попытаться загрузить их, даже если другой уже работает с этими файлами. Вы говорите, что IntentService, который вызывает Alarm, будет отдельным элементом в стеке выполнения и будет просто продолжать заниматься своими делами без вызова второго? - person Yevgeny Simkin; 27.02.2011
comment
@Доктор. Dredel: он может увидеть те же файлы и попытаться загрузить их, даже если другой уже работает с этими файлами — это невозможно, если только ваш сервис не содержит ошибок. Вы говорите, что IntentService, который вызывает Alarm, будет отдельным элементом... и будет просто продолжать заниматься своими делами без вызова второго? -- Да. Второй сигнал тревоги Intent будет обработан тем же IntentService после onHandleIntent() завершения обработки первого сигнала тревоги Intent. IntentService — это рабочая очередь, а все сервисы — синглтоны. - person CommonsWare; 27.02.2011
comment
Очень нравится этот способ: runni" title="android, как проверить, работает ли служба намерений или она была остановлена ​​runni"> stackoverflow.com/questions/7440473/ - person Renan Franca; 29.08.2013