Вопросы для начинающих: Wakelocks - PullRequest
7 голосов
/ 23 ноября 2010

Я новичок в понятии WakeLock и мне нужна ваша помощь.

Вопросы:

  1. Я предполагаю, что WakeLock - это какой-то тип блокировки, который при удержаниивыполнение кода не дает устройству спать.Что если устройство уже находится в режиме ожидания / ожидания, будет ли выполняться код?Предполагая, что он никогда не приобретет WakeLock?

  2. Когда в фоновом потоке (AsyncTask) выполняется длительное задание (около 7-8 секунд), стоит ли мне беспокоиться о проведении WakeLock?AsyncTask уже приобрел его для меня?

  3. ссылки на официальную документацию и рецензирование на wakelocks приветствуются.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

1.Если телефон находится в спящем режиме, кроме входящего телефонного звонка, вы можете использовать намерение AlarmManager, чтобы разбудить телефон.

Из документации класса AlarmManager :

Диспетчер аварийных сигналов удерживает блокировку пробуждения ЦП , пока выполняется метод onReceive () приемника аварийных сигналов.Это гарантирует, что телефон не будет спать, пока вы не закончили обработку трансляции.Как только onReceive () возвращается, диспетчер тревог снимает эту пробужденную блокировку.Это означает, что телефон в некоторых случаях будет спать, как только ваш метод onReceive () завершится.Если ваш приемник тревоги называется Context.startService (), возможно, что телефон будет находиться в спящем режиме до запуска запрошенной службы.Чтобы предотвратить это, вашему BroadcastReceiver и службе потребуется реализовать отдельную политику блокировки пробуждения, чтобы телефон продолжал работать до тех пор, пока служба не станет доступной.

2.Если вы работаете с AsyncTask , вы захотите опубликовать результаты в потоке пользовательского интерфейса на onPostExecute()

Из документации AsyncTask :

AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса.Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.

3. Я предлагаю вам прочитать на официальномдокументация Power Manager , которая дает хорошее представление о концепции WakeLock.

3 голосов
/ 23 ноября 2010
  1. Обычно единственный код, который запускается, когда телефон находится в спящем режиме, - это BroadcastReceiver.На самом деле телефон на секунду просыпается, запускает код BroadcastReceiver и снова спит.Поскольку вы никогда не должны запускать длинный код в BroadcastReceiver (используйте его для запуска Service), вы можете предположить, что ваш код никогда не запускается, когда телефон спит.Конечно, если вы используете BroadcastReceiver для запуска Service, вы обычно должны получить WakeLock.

  2. При AsyncTask, инициированном пользователем, вы недействительно нужно беспокоиться о WakeLocks.Вряд ли телефон будет спать во время работы.Я не уверен, что они получают WakeLock, но перевод телефона в спящий режим при работе со стандартным AsyncTask, похоже, не прерывает его.

  3. Как сказал SteD, проверьтеВот что: http://developer.android.com/reference/android/os/PowerManager.html

По сути, единственное время, когда вам нужно беспокоиться о WakeLocks, это когда вы ожидаете, что ваша задача будет прервана сном (как в случае, если вы устанавливаете будильник, который будиткратко позвоните) или если ваш absolutley не может быть прервана задача.В противном случае просто убедитесь, что вы корректно обрабатываете любые прерывания.

...