AlarmManager с флаг AlarmManager.INTERVAL_DAY се изпълнява през текущия ден, а не през следващия ден

Трябва да добавя насочени известия в моето приложение за Android. Известието трябва да се показва всеки ден в определен час (например в 13:00). За да направя това, използвам AlarmManager. Регистрирам аларма, когато приложението стартира за първи път. Но имам проблем. Ако инсталирам приложението си на устройство, например в 13.10, тогава алармата работи веднага след стартирането на приложението ми. Но това е грешно, защото имам нужда тази аларма да работи на следващия ден, а не на текущия ден. Някой може ли да ми помогне и да каже как да настроя ежедневна аларма, която трябва да започне да работи в деня около текущия ден.

Това е моят код, който използвам в момента

private void registerAMAlarmManger(){
    mAMAlarmIntent = new Intent(this, AMAlarmReceiver.class);
    mAMPendingIntent = PendingIntent.getBroadcast(this, 0, mAMAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    SharedPreferences sPrefs = getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE);
    int amTime = sPrefs.getInt(Constants.MORNING_TIME, 9);

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, amTime);
    calendar.set(Calendar.MINUTE, 0);

    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, mAMPendingIntent);


}

person bukka.wh    schedule 19.05.2015    source източник


Отговори (2)


ако времето е изтекло за текущата дата, той изпълнява кода за извършване на аларма. Това трябва да се обработи. Правя го по следния начин

    Calendar calendar = Calendar.getInstance();
                        calendar.setTimeInMillis(System.currentTimeMillis());
                        calendar.set(Calendar.HOUR_OF_DAY, mytesthourofday);
                        calendar.set(Calendar.MINUTE,
                                Integer.parseInt(min_am_pm[0]));
                        // calendar.set(Calendar.AM_PM, am_pm_integer);
                        calendar.set(Calendar.SECOND, 0);
                        calendar.set(Calendar.MILLISECOND, 0);

                        if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
                            calendar.add(Calendar.DAY_OF_MONTH, 1);
                        }

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                            calendar.getTimeInMillis(), 1000 * 24 * 60 * 60,
                            pendingIntent);
person vaibhav    schedule 19.05.2015
comment
Благодаря за отговора. Бих искал да изясня тази част от кода if (calendar.getTimeInMillis() ‹ System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_MONTH, 1); }. Тук проверявате дали времето на алармата е по-малко от текущото време и в този случай добавяте един ден, за да стартирате алармата на следващия ден? - person bukka.wh; 19.05.2015
comment
И още един въпрос: calendar.setTimeInMillis(System.currentTimeMillis()); Необходим ли е този ред код? Защото в някои уроци за AlarmManager тя липсва. - person bukka.wh; 19.05.2015
comment
Да, добавям един ден .. т.е. следващия ден - person vaibhav; 08.06.2015

person    schedule
comment
обяснете кода си, така че OP да получите повече подсказки, не просто публикувайте код - person N J; 19.06.2015