Я не уверен, но, насколько мне известно, я разделяю свои взгляды. Я всегда принимаю лучший ответ, если ошибаюсь.
Менеджер по тревоге
Менеджер аварийных сигналов удерживает блокировку пробуждения ЦП, onReceive()
пока выполняется метод приемника аварийных сигналов . Это гарантирует, что телефон не перейдет в спящий режим, пока вы не завершите обработку трансляции. После onReceive()
возврата диспетчер сигналов тревоги снимает эту блокировку пробуждения. Это означает, что в некоторых случаях телефон перейдет в спящий режим, как только ваш onReceive()
метод завершится. Если ваш приемник будильника звонил Context.startService()
, возможно, телефон перейдет в спящий режим до запуска запрошенной службы. Чтобы предотвратить это, ваш BroadcastReceiver
иService
нужно будет реализовать отдельную политику блокировки бодрствования , чтобы убедиться , что телефон продолжает работать , пока служба не станет доступной.
Примечание. Диспетчер сигналов тревоги предназначен для случаев, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено. Для обычных операций с таймингом (тики, тайм-ауты и т. Д.) Проще и эффективнее использовать Handler.
таймер
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));
Timer
имеет некоторые недостатки, которые устраняются с помощью ScheduledThreadPoolExecutor
. Так что это не лучший выбор
ScheduledThreadPoolExecutor .
Вы можете использовать java.util.Timer
или ScheduledThreadPoolExecutor
(предпочтительно), чтобы запланировать действие, которое должно происходить через регулярные промежутки времени в фоновом потоке.
Вот пример использования последнего:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
Так что я предпочел ScheduledExecutorService
Но также подумайте о том, что если обновления будут происходить во время работы вашего приложения, вы можете использовать Timer
, как предлагается в других ответах, или более новый ScheduledThreadPoolExecutor
. Если ваше приложение будет обновляться, даже если оно не запущено, вам следует использовать расширение AlarmManager
.
Диспетчер сигналов тревоги предназначен для случаев, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в настоящее время не запущено.
Обратите внимание, что если вы планируете обновлять, когда ваше приложение выключено, раз в десять минут это довольно часто и, следовательно, может быть слишком энергоемким.