Вот почему я пытался остановить службу с помощью AsyncTask.
Это не поможет, как я пытался объяснить в комментариях к вашему вопросу. Если onDestroy()
занимает слишком много времени, вам нужно выполнить эту работу раньше и в фоновом потоке. Вводить вызов stopService()
в фоновом потоке совершенно бессмысленно.
Сам сервис уже работает в фоновом режиме, а не в потоке пользовательского интерфейса.
Нет, это не так.
onDestroy()
вызывается в главном потоке приложения. Всегда .
Ваша служба может также иметь собственный фоновый поток для другой работы, но методы жизненного цикла (onCreate()
, onStartCommand()
, onBind()
и onDestroy()
) всегда вызываются основная ветка приложения.
Итак, если остановка службы заняла много времени, почему приложение зависло?
Потому что вы делаете слишком много работы в onDestroy()
.
Служба и команда, ожидающая возврата остановленной службы, не выполняются в потоке пользовательского интерфейса.
onDestroy()
вызывается в главном потоке приложения (a.k.a., "UI-thread").
ОБНОВЛЕНИЕ на основании первого комментария:
Когда я вызываю onDestroy () внутри службы
Вы никогда не звоните onDestroy()
. Android звонит onDestroy()
. Вы не Android.
onDestroy () вызывается не внутри службы для самой службы, а в основном потоке?
Кажется, вы думаете, что сервис - это поток. Это не. Вы можете сказать это, прочитав документацию («Обратите внимание, что службы, как и другие объекты приложений, работают в главном потоке процесса их размещения».). Пожалуйста, прочитайте документацию.