Расписание AlarmManager Тревога при запуске приложения

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

    @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, объясните проблему.


person Evgeniy Mishustin    schedule 06.05.2016    source источник


Ответы (1)


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

Насколько я знаю, он ищет существующий аварийный сигнал для эквивалента PendingIntent. Здесь под «эквивалентом PendingIntent» я имею в виду:

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

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

person CommonsWare    schedule 06.05.2016
comment
Так это просто пропуск будильника по расписанию или отмена предыдущего? - person Evgeniy Mishustin; 07.05.2016
comment
@LuciusHipan: Предыдущий будильник должен быть отменен, как если бы вы позвонили cancel(). Так как cancel() принимает PendingIntent в качестве единственного идентификатора того, какую тревогу следует отменить, может быть только одна тревога на PendingIntent. - person CommonsWare; 07.05.2016
comment
Это означает, что если я запланировал это в OnCreate() на 10 минут, но я снова открою приложение через 8 минут, будильник не будет активирован через 2 минуты оттуда? - person Evgeniy Mishustin; 07.05.2016
comment
@LuciusHipan: я бы этого не ожидал. В последнее время я не пробовал этот конкретный сценарий, поэтому я забыл, делает ли Android здесь что-то неожиданное. - person CommonsWare; 07.05.2016
comment
Я только что попробовал, и он ведет себя так, как я сказал ... Печально, что нигде в документах не появляется проблема. Интересно, сколько разработчиков столкнулись с неточными событиями на основе сигналов тревоги. Спасибо за вашу помощь. - person Evgeniy Mishustin; 07.05.2016