2016-02-19 4 views
0

У меня есть следующие 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 минут, но должен ли я ожидать сравнительный процент времени отклонения?

Как я могу убедиться, что он будет вызван точно (или с очень небольшим отклонением) до указанного мною интервала?

+1

поскольку API 19, диспетчер аварийных сигналов называется неточным. вместо setRepeating, вы можете использовать setExact и выполнять повторы сами по себе программно. – Opiatefuchs

+0

@Opiatefuchs 'диспетчер тревог называется неточным', трудно поверить, что это вызовет почти 5-минутную задержку, не думайте, что это проблема (или), или я не прав? – Strider

+0

Если вы действительно уверены, что ваша переменная «время» верна, то что еще? Да, 5 минут, кажется, очень долгое время, но, как описано в API, «ОС будет сбрасывать сигналы тревоги, чтобы свести к минимуму пробуждения и использование батареи» .... проверили ли вы, что ваше «время» установлено правильно? – Opiatefuchs

ответ

1

Из документов в setRepeating():

Примечание: по API 19, все повторяющиеся сигналы являются неточными. Если ваше приложение нуждается в точном сроке доставки, оно должно использовать одноразовые точные аварийные сигналы , пересматривая каждый раз, как описано выше. Legacy приложения, чья targetSdkVersion ранее API 19 будет , продолжают иметь все свои аварийные сигналы, включая повторяющиеся сигналы тревоги, считаются точными.

Вы можете использовать setExact() и установить интервалы самостоятельно.

+0

Позволяет ли это повторять звонки вещательного приемника? – crm

+0

Нет, повторение должно быть задано вами. – Piyush

+0

Не могу видеть, как утверждать это как правильный ответ –

Смежные вопросы