#android #service #commonsware-cwac
#Android #Обслуживание #commonsware-cwac
Вопрос:
Мне действительно нравится раздел об AlarmManager в книге CWAC Advanced Android. Теперь я беспокоюсь о том, что работа моего приложения будет прервана, потому что у него нет блокировки пробуждения. Вот о чем я беспокоюсь. Рационально ли мое беспокойство?
Смотрите код ниже. Что, если doWakefulWork должен запустить другую службу? В этом случае другой службе необходимо установить блокировку пробуждения, чтобы продолжать работать, однако существует промежуток времени между запуском службы и завершением onHandleIntent, когда блокировка пробуждения может быть снята!
@Override
final protected void onHandleIntent(Intent intent) {
try {
doWakefulWork(intent)
}
finally {
getLock(this).release();
}
}
Мой текущий ответ таков:
doWakefulWork должен выполняться в том же потоке, он не может запускать другие потоки или службы, если другие службы также не являются экземплярами WakefulIntentService.
Я прав?
Комментарии:
1. Почему у вас вообще есть две службы?
2. В одном случае doWakefulWork запустит действие. Если она запускает действие, то есть ли необходимость в блокировке пробуждения? В другом случае существует некоторый уже существующий код. Я мог бы выполнить модернизацию, как вы предлагаете.
3. Если она запустит действие, устройство перейдет в спящий режим, если пользователь не взаимодействует с действием первым. Поскольку вы понятия не имеете, находится ли пользователь где-либо рядом с устройством в данный момент, я настоятельно рекомендую вам не пытаться поддерживать работу устройства в ожидании пользователя. Я предполагаю, что объединение двух сервисов может упростить вашу жизнь в долгосрочной перспективе, но это всего лишь предположение.
Ответ №1:
Если вы хотите, чтобы другие ваши сервисы содержали a WakeLock
, тогда да, они должны либо быть a WakefulIntentService
, либо приобретать WakeLock
сами. Если вас беспокоит время между отправкой намерения и фактическим получением блокировки другой службой, вам необходимо реализовать какой-либо механизм блокировки (т. Е. заблокировать doWakefulWork
завершение метода до тех пор, пока другая служба не запустится и не получит блокировку)
Комментарии:
1. Подход с использованием блочного метода слегка непригляден, но может сработать. Я бы просто внедрил шаблон wakeful, если другая служба сама по себе не является
WakefulIntentService
.WakefulIntentService
Код довольно маленький и в основном описан в вышеупомянутой книге.