2016-05-06 3 views
0

Это очень глупый вопрос, и я до сих пор не могу понять, как работает AlarmManager в Android. Предположим, я хочу запланировать повторяющуюся задачу каждые полчаса. Я хочу запланировать его на активность onCreate(). Я делаю что-то вроде этого:Расписание AlarmManager Тревога при запуске приложения

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 
     alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmReceiver.class); 
     alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
     alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     AlarmManager.INTERVAL_HALF_HOUR, 
     AlarmManager.INTERVAL_HALF_HOUR, alarmIntent); 
} 

Теперь мой вопрос, как же ОС знает, что этот сигнал уже запланированную? Я имею в виду, что это не планирование нового при каждом создании активности, не так ли? В противном случае, после 10 запусков активности, я получаю сигнал тревоги каждые три минуты, а не полчаса. Пожалуйста, любой гуру Android, объяснение о проблеме.

ответ

1

Теперь мой вопрос: как OS знает, что этот будильник уже запланирован?

AFAIK, он ищет существующий аварийный сигнал для эквивалента PendingIntent. Здесь, "эквивалентного PendingIntent", я имею в виду:

  • ту же операцию (например, getBroadcast())
  • тот же идентификатор (второй параметр getBroadcast())
  • эквивалент Intent

Здесь , «эквивалентом Intent», я имею в виду, что они соответствуют всей информации о маршрутизации, которая в вашем случае равна ComponentName, сгенерированным с this и AlarmReceiver.class. Дополнительно, в частности, здесь не учитывается эквивалентность.

+0

Так что это просто пропустить планирование будильника или отменяет предыдущий? –

+0

@LuciusHipan: Он должен отменить предыдущий сигнал тревоги, как если бы вы вызвали 'cancel()'. Поскольку 'cancel()' принимает 'PendingIntent' в качестве единственного идентификатора того, какой аварийный сигнал отменяется, может быть только один сигнал тревоги на' PendingIntent'. – CommonsWare

+0

Итак, это значит, если у меня есть это в OnCreate(), запланированном на 10 минут, но я снова закрою приложение за 8 минут, будильник не будет запущен через 2 минуты? –

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