Как да настроите алармата да се задейства правилно в определено време?

Имам този код

Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_YEAR, 1);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 22);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        // We want the alarm to go off 30 seconds from now.
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 30*1000;
        long a=c.getTimeInMillis();

        // Schedule the alarm!
        AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                c.getTimeInMillis(), 1*60*60*1000, sender);

Не се изпълнява в 23:22ч

Какво правя грешно? Забелязах, че firstTime и c.getTimeInMillis() се различават много по размер и дължина. Когато използвам firstTime, така че когато съм настроен на 30 секунди, алармата се изпълнява добре.


person Pentium10    schedule 07.06.2010    source източник
comment
Видях това в този пример: google.com/codesearch/p?hl=en#kZ0MkhnKNzw /trunk/Photostream/src/   -  person Pentium10    schedule 08.06.2010


Отговори (3)


Използвате флага AlarmManager.ELAPSED_REALTIME_WAKEUP, но използвате календарен обект. Тези две неща не вървят заедно.

Трябва да използвате AlarmManager.RTC или AlarmManager.RTC_WAKEUP, ако указвате часа на алармата с помощта на обект Календар или Дата (милисекунди от 1970 г.).

Използвате AlarmManager.ELAPSED_REALTIME или AlarmManager.ELAPSED_REALTIME_WAKEUP, когато указвате часа на алармата чрез SystemClock.elapsedRealtime() (милисекунди след зареждането на телефона).

person Mark B    schedule 07.06.2010

Имах успех със следния код, ако искате да настроите алармата само за следващото появяване на hh:mm

Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, 22);
    cal.set(Calendar.MINUTE, 19);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    //check if we want to wake up tomorrow
    if (System.currentTimeMillis() > cal.getTimeInMillis()){
        cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ...
    }
person Tom    schedule 02.09.2010
comment
Това е точният отговор коя пожарна аларма на следващия ден, ако времето е изтекло - person Anand Savjani; 12.09.2016

За да накарате алармата да се включи след 30 секунди, използвайте

Calendar cal = Calendar.getInstance();

за да получите текущия час и след това

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

Редактиране:

Мисля, че проблемът е ELAPSED_REALTIME_WAKEUP. Това казва на AlarmManager, че времето, което му давате, се основава на времето от стартирането на системата. Това е добре за 30 секунди от сега, но ако искате да се основава на реално време, трябва да използвате RTC или RTC_WAKEUP. Вижте javadoc за пълно обяснение на тези типове.

person Cheryl Simon    schedule 07.06.2010
comment
Трябва да изляза точно в 23:22ч. Вече имам работещо решение за изключване след 30 секунди, което работи добре. - person Pentium10; 08.06.2010