AlarmManager с флагом AlarmManager.INTERVAL_DAY выполняется в текущий день, а не в следующий день

Мне нужно добавить push-уведомления в мое приложение для 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
Спасибо за ответ. Я хотел бы уточнить эту часть кода, если (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
Да, я добавляю один день .. I.e nxt день - person vaibhav; 08.06.2015

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