Страница 1 из 1

Service не останавливается при вызове stopselfResult

Добавлено: 08 июл 2013, 15:08
JaguaR
Привет всем!

Есть Service, в onStartCommand возвращаю START_REDELIVER_INTENT для восстановления незавершенных вызовов, сохраняя Intent. В onStartCommand создаю новый поток и запихиваю его в пул ExecutorService для поочередного выполнения (executor = Executors.newFixedThreadPool(1)), сохраняя startId в классе потока. По завершению работы потока (в run()) вызываю stopSelfResult(startId). Поток знает свой startId.

Из Activity делаю 2 вызова запуска сервиса, соответственно в сервисе 2 раза срабатывает onStartCommand и создает 2 потока с startId 1 и 2. По завершению первого потока (startId = 1) stopselfResult = false, по завершению второго потока stopselfResult = true, т.к. startId=2 является последним вызовом и сервис останавливается. Все ок.

Проблема в следующем :
Ничего не меняю в вызовах. Специально убиваю приложение сразу после получения двух вызовов onStartCommand и запуска первого потока (startId = 1). Жду когда сервис восстановится и восстановит незавершенные вызовы.. так и происходит.. Сервис создается (onCreate()), 2 раза срабатывает onStartCommand (на входе имею startId = 1 и startId = 2 и восстановленные Intent-ы), создаются потоки и отсылаются на выполнение в ExecutorService. По завершению первого потока (startId = 1) stopselfResult = false, по завершению второго потока (startId = 2)... внимание... stopselfResult = false... и соответственно сервис НЕ ОСТАНАВЛИВАЕТСЯ.. Как так?? Сервис останавливает только принудительный вызов stopselfResult(3).... Но откуда взялся третий вызов onStartCommand ? StartId были только 1 и 2.

Друзья, подскажите, почему так происходит..

Re: Service не останавливается при вызове stopselfResult

Добавлено: 09 июл 2013, 14:08
anber
Мне сложно сказать почему так происходит. Думаю если ты сделаешь архивчик с кодом о котором идет речь и выложишь тут будт проще.

Re: Service не останавливается при вызове stopselfResult

Добавлено: 09 июл 2013, 15:17
JaguaR
Ок. Выкладываю. Я специально делал минимальную программу только для проверки этой логики (думал в реальном приложении что-то лишнее накрутил).