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 сутринта. Веднага след настройката алармата ще се включи. Този случай се случва с помощта на .setReapeting. Как мога да предотвратя алармата, ако е зададено след системното време? - person useletters; 16.07.2013
comment
следващият ми коментар щеше да е само да добавя проверката :) радвам се, че най-накрая проработи :) - person Srikanth Roopa; 17.07.2013