Что, если doWakefulWork запустит другую службу?

#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 Код довольно маленький и в основном описан в вышеупомянутой книге.