AlarmManager запускает сигнал тревоги после времени, когда он был установлен в тот же день, setRepeating

Итак, в основном у меня есть этот код, время возвращает 24-часовое время и ежедневно повторяет будильник.

public setAlarm(String time, Context context){
    String[] strTime;

    strTime = time.split(":");

    int hour, min, sec;
    //set when to alarm
    hour = Integer.valueOf(strTime[0]);
    min = Integer.valueOf(strTime[1]);
    sec = 0;

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, min);
    cal.set(Calendar.SECOND, sec);
    //Create a new PendingIntent and add it to the AlarmManager
    Intent intent = new Intent(context, AlarmReceiverActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}

В любом случае, проблема в том, что когда я ставлю будильник на 9 утра, а время 9:10, будильник сработает. Почему? Я хочу, чтобы он не подавал сигнал тревоги, если он установлен после системного времени. Бывший. поставь будильник на 9 утра, а системное время 9:10


person useletters    schedule 15.07.2013    source источник


Ответы (3)


У меня это работает сейчас. Добавил чекер времени будильника и текущего времени.

public setAlarm(String time, Context context){
        String[] strTime;

        strTime = time.split(":");

        int hour, min, sec;
        //set when to alarm
        hour = Integer.valueOf(strTime[0]);
        min = Integer.valueOf(strTime[1]);
        sec = 0;

        long _alarm = 0;
        Calendar now = Calendar.getInstance();
        Calendar alarm = Calendar.getInstance();
        alarm.set(Calendar.HOUR_OF_DAY, hour);
        alarm.set(Calendar.MINUTE, min);
        alarm.set(Calendar.SECOND, sec);

        if(alarm.getTimeInMillis() <= now.getTimeInMillis())
            _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
        else
            _alarm = alarm.getTimeInMillis();               

        //Create a new PendingIntent and add it to the AlarmManager
        Intent intent = new Intent(context, AlarmReceiverActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent);
    }
person useletters    schedule 16.07.2013
comment
AlarmManager.INTERVAL_DAY+1 — Почему вы добавляете +1? - person ; 19.03.2014
comment
Потому что если тревога задерживается (например, из-за сна системы, для типов тревог, отличных от _WAKEUP), пропущенный повтор будет доставлен как можно скорее. После этого будущие тревоги будут доставляться по первоначальному расписанию; они не смещаются со временем. Например, если вы установили повторяющийся будильник на начало каждого часа, но телефон спал с 7:45 до 8:45, будильник будет отправлен, как только телефон проснется, а следующий будильник будет отправлен в 9:00. Таким образом, будильник сработает, если вы установите его в тот же день. - person FeanDoe; 27.06.2017

Принятый ответ неверен, поскольку я попробовал его, а затем понял решение.

Это неправильно, потому что, как вы видите здесь: Calendar now = Calendar.getInstance(); Calendar alarm = Calendar.getInstance(); alarm.set(Calendar.HOUR_OF_DAY, hour); alarm.set(Calendar.MINUTE, min); alarm.set(Calendar.SECOND, sec);

«Календарь сейчас» и «Будильник календаря» всегда будут одинаковыми, несмотря ни на что, потому что они делают одно и то же почти в одном и том же месте кода, поэтому Calendar.getInstance() всегда будет одним и тем же.

Решение это

    long _alarm;
    Calendar now = Calendar.getInstance();
    long oldtimer = now.getTimeInMillis();

    cal.set(Calendar.HOUR_OF_DAY, Hours2int);
    cal.set(Calendar.MINUTE, minutes2int);
    cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
    cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
    cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
    cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));

    //Calendar alarm = Calendar.getInstance();

    long newtimer = cal.getTimeInMillis();


    if(newtimer < oldtimer) {
        //do the thing
    }
person Cain Olivares    schedule 16.05.2015
comment
Или еще проще: if (cal.getTimeInMillis() < System.currentTimeMillis()) { cal.add(Calendar.DATE, 1); } - person gmk57; 24.08.2018

Используйте setInexactRepeating вместо setRepeating

    Calendar cal= Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 9);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    PendingIntent pi = PendingIntent.getService(context, 0,
        new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                            AlarmManager.INTERVAL_DAY, pi);
person Srikanth Roopa    schedule 15.07.2013
comment
Когда вы хотите активировать будильник именно разработчик Android - person Srikanth Roopa; 16.07.2013
comment
Все та же проблема.. Intent intent = new Intent(context, AlarmReceiverActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); - person useletters; 16.07.2013
comment
Хорошо. Позвольте мне снова рассказать вам пример. Я хочу, чтобы мое устройство подавало сигнал тревоги каждые 9 утра. Если системное время уже 9:10, и я поставлю будильник на 9:00. Сразу после установки будильник сработает. Этот экземпляр происходит с использованием .setReapeting. Как я могу предотвратить срабатывание сигнализации, если она была установлена ​​за пределами системного времени? - person useletters; 16.07.2013
comment
мой следующий комментарий был бы только о том, чтобы добавить чек :) рад, что это наконец сработало :) - person Srikanth Roopa; 17.07.2013