Android AlarmManager запускает каждые "круглые" 10 минут
Я использую AlarmManager в своем приложении следующим образом:
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, intent);
Что я ожидаю, чтобы вызвать тревогу где-то между 12 и 24 часами с каждого триггера. Однако поведение, особенно на устройствах HTC, довольно странно:
Каждый раз, когда срабатывает будильник, мы отправляем HTTP-запрос на наши серверы. На всех устройствах мы видим запросы, поступающие на сервер равномерно с течением времени, но на устройствах HTC есть шипы каждые "круглые" 10 минут (XX: 10, XX: 20,...):
![введите описание изображения здесь]()
Что может быть причиной этих всплесков? И почему это будет только на устройствах HTC?
Ответы
Ответ 1
Мы не можем видеть остальную часть вашего кода, но вы отменяете предыдущее намерение, как показано ниже:
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, TimeAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, pendingIntent);
В противном случае это, вероятно, плохое управление AlarmManager от HTC, попробуйте эти различные исследования (это может показаться смешным, но лучше бросить вызов каждому элементу):
- Добавьте немного задержки в
System.currentTimeMillis()
, а не только System.currentTimeMillis()
- Используйте значение
43200000
(постоянное значение), а не AlarmManager.INTERVAL_HALF_DAY
- Попробуйте этот с помощью
Calendar
- Попробуйте другие параметры для
setInexactRepeating
Я не нашел никаких известных и перечисленных ошибок на эту тему. Если ваши расследования ничего не дают, вы, вероятно, ничего не сможете сделать. В этом случае вам нужно будет установить обходной путь для HTC, который не использует AlarmManager таким образом.
Ответ 2
Прежде всего отменить предыдущий alaram
private void cancelAlarm(Context context, Class aClass) {
Intent intent = new Intent(context, aClass);
PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pintent);
}
Затем создайте новый сигнал тревоги.
public static void setAlarmManager(Context context, Class aClass, String time) {
Intent intent = new Intent(context, aClass);
PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// alarm.cancel(pintent);
// "auto_sync":"1","sync_time":"04:05"
String timeArr[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArr[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArr[1]));
alarm.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), INTERVAL, pintent);
}
В диспетчере аварийных сообщений устройств недостаточно. В этом случае используйте SharedPreferences, чтобы сохранить предыдущее время при создании или обновлении нового диспетчера аварийных сигналов. эта сохраненная ценность также полезна, когда вы будете пытаться выполнять ежедневную операцию.
Ответ 3
Я вижу, что вы пробовали AlarmManager.RTC_WAKEUP, не могли бы вы попробовать AlarmManager.ELAPSED_REALTIME_WAKEUP?
Загрузите будильник, когда телефон включится с помощью
<receiver android:name=".YourBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="your.package.BOOT_FIRSTTIME"/>
</intent-filter>
</receiver>
Используйте user.package.BOOT_FIRSTTIME, когда пользователь активирует Alarm.
Затем настройте свой AlarmManager следующим образом:
24 часа в миллисекундах - 86400000
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 86400000, pendingIntent);
Ответ 4
Добавление интервала к второму параметру, т.е. triggerAtMillis помогло мне
alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis()+interval, interval, pendingIntent);
проверьте здесь для более подробной информации.