У меня есть следующие BroadcastReceiver
:AlarmManager не вызывая BroadcastReceiver точно каждый интервал
public class LocationUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
LocationHelper locationHelper = new LocationHelper(context);
locationHelper.updateLocation();
//.. do stuff with location
}
public static void SetAlarm(Context context, Long time){
Intent intentAlarm = new Intent(context, LocationUpdateReceiver.class);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = PendingIntent.getBroadcast(context, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), time, pi);
}
public static void CancelAlarm(Context context) {
Intent intent = new Intent(context, LocationUpdateReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
Я называю метод setAlarm, как это проверить из деятельности: LocationUpdateReceiver.SetAlarm (это, 3000L);
Вы заметите, что я звоню setRepeating()
, который, как я думал, должен был назвать класс приемника ровно через каждые 3 секунды?
Проблема в том, что чаще всего это не вызывает приемник более 5 минут, это довольно большое отклонение. Я намерен запускать приемник каждые 30 минут, но должен ли я ожидать сравнительный процент времени отклонения?
Как я могу убедиться, что он будет вызван точно (или с очень небольшим отклонением) до указанного мною интервала?
поскольку API 19, диспетчер аварийных сигналов называется неточным. вместо setRepeating, вы можете использовать setExact и выполнять повторы сами по себе программно. – Opiatefuchs
@Opiatefuchs 'диспетчер тревог называется неточным', трудно поверить, что это вызовет почти 5-минутную задержку, не думайте, что это проблема (или), или я не прав? – Strider
Если вы действительно уверены, что ваша переменная «время» верна, то что еще? Да, 5 минут, кажется, очень долгое время, но, как описано в API, «ОС будет сбрасывать сигналы тревоги, чтобы свести к минимуму пробуждения и использование батареи» .... проверили ли вы, что ваше «время» установлено правильно? – Opiatefuchs