Нет вызова onStartCommand () после перезапуска аварийного сервиса в Android 2.3 - PullRequest
9 голосов
/ 22 марта 2011

У меня проблема с перезапуском службы Android.Я использую API версии 7 и работаю на устройстве с Android 2.3.3.

Проблема заключается в том, что когда мой сервис прерывается системой, а затем перезапускается, только onCreate() моего сервисаназывается.код в onStartCommand() не выполняется.Если я запускаю свое приложение в первый раз, код в onStartCommand() обычно выполняется и все работает нормально, пока система не убьет мой сервис, тогда сервис не будет перезапущен правильно.

В документации сказано, что onStartCommand() всегда вызывается при перезапуске службы. В случае перезапуска службы onStartCommand() следует вызывать с нулевым намерением.Это не мой случай.

Есть идеи, почему это может произойти?

Ответы [ 2 ]

11 голосов
/ 22 марта 2011

Возможно, вы видите ошибку в Gingerbread.В группе разработчиков android была тема: Тема ошибки onStartCommand

Подробности см. В записи под номером 26 от Dianne Hackborn.

2 голосов
/ 05 сентября 2013

Это ошибка в Android 2.3 (API уровня 9), которая была исправлена ​​в API уровня 10.

От Dianne Hackborns Пост по этой проблеме :

Хорошо, это действительно сломалось в 3.3. [Так!] Изменение было с августа прошлый год. Это изменение, которое сломало его:
https://android.googlesource.com/platform/frameworks/base/+/5474b0f8603ee66413c3e44600ca46f162f3089e

Обратите внимание, что ранее ссылка git commit не работала. Нажмите здесь, чтобы получить рабочее зеркало-ссылку на коммит и строку, которая вызывает ошибку.

Также она имела в виду 2,3, но написала 3,3. Она позже исправила это и предложила обходной путь:

Извините, да, я имел в виду 2,3.

Это было в кодовой базе с момента выпуска кода GB, поэтому будет кто знает, какие устройства поставляются с ним.

Проблема в не в том, что службы не перезапускаются, только в этом их onStartCommand () не вызывается с нулем в это время. Метод onCreate () по-прежнему вызывается. В качестве обходного пути вы можете возможно, просто опубликуйте сообщение в onCreate () и установите флаг в onStartCommand (); если вы не получили onStartCommand () Если сообщение обработано, вы, вероятно, не получите нулевой намеренный вызов. (Если вам нужно сделать это вообще ... вообще для таких вещей, как регистрация получателей, вы действительно хотите сделать это в onCreate (), так как этот метод вызывается только один раз.)

Она также написала , что это поведение будет исправлено в следующем обновлении платформы (после 3.0):

Я исправлю это в следующем обновлении платформы (после Android 3.0); к сожалению, этот код уже давно отсутствует в исходном дереве, и в паре релизов сейчас, так что нам нужно жить с разбитым поведение на этих версиях. У службы все еще будет свой onCreate () называется, чтобы вы могли работать там.

Я предполагаю, что уровень API, который она имела в виду, был 10, , и я могу подтвердить, что onStartCommand() вызывается с нулевыми намерениями после перезапуска службы при переключении с уровня API 9 на 10.

...