Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Задать определенное время в AlarmManager

#android #java


Возникла проблема при вызове Notification в определенное время суток. 
Notification вызываю при помощи AlarmManager.
Когда задаю текущее время (System.currentTimeMillis()), проблем не возникает, все
отлично запускается и выводится, но как только пытаюсь задать определенное, то бишь,
точное время, ничего не происходит. Что подскажете? Как правильно задать время?  

Рабочий вариант:

private void restartNotify(Context context) {
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent notifyIntent = new Intent(context, NotificationMessage.class);
    contentIntent = PendingIntent.getBroadcast(this, 0,
                    notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), contentIntent);
}


Не рабочий:

private void restartNotify(Context context) {
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent notifyIntent = new Intent(context, NotificationMessage.class);
    contentIntent = PendingIntent.getBroadcast(this, 0,
            notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR, 15);
    calendar.set(Calendar.MINUTE, 20);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent);
}


Решил проблему. Вот реализация: 

 private void restartNotify(Context context) {
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent notifyIntent = new Intent(context, NotificationMessage.class);
        contentIntent = PendingIntent.getBroadcast(this, 0,
                notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );

        Calendar calendar = Calendar.getInstance();
        Calendar cal = Calendar.getInstance();

        calendar.set(Calendar.YEAR, cal.get(Calendar.YEAR));
        calendar.set(Calendar.MONTH, cal.get(Calendar.MONTH));
        calendar.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, 13);
        calendar.set(Calendar.MINUTE, 53);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent);
    }


Прошу обратить внимание, кому интересно, что бы все заработало, нужно задать все
пункты (год, месяц, день, часы, минуты, секунды, миллисекунды). Важный пункт calendar.set(Calendar.HOUR
OF DAY, 13);. Если указать Calendar.HOUR вместо Calendar.HOUR OF DAY то время вместо
24-х часового формата, будет использовать 12-ти часовой, из-за чего время будет считаться
указанным не верно (Если у вас на телефоне 24-х часовой формат)
    


Ответы

Ответ 1



А можете проверить какое именно время вы получаете в calendar.getTimeInMillis()? И попробуйте вместо обычного использовать григорианский календарь Calendar calendar = new GregorianCalendar()

Ответ 2



Достаточно 3 параметров. Можно упростить на Kotlin: Calendar calendar = Calendar.getInstance().apply { calendar.set(Calendar.HOUR_OF_DAY, 13); calendar.set(Calendar.MINUTE, 53); calendar.set(Calendar.SECOND, 0); }

Комментариев нет:

Отправить комментарий