calender.add не работает нормально в android - PullRequest
0 голосов
/ 05 апреля 2020

цель, которую я пишу этот код, состоит в том, чтобы убедиться, что мои приложения будут уведомлять пользователя в определенное время, и приложения будут повторять одно и то же уведомление каждый день, начиная с 7 часов утра.

Однако я попытался использовать эту функцию (как показано ниже). Но похоже, что это не сработает.

calender.add (ДАТА, 1)

На самом деле я хочу создать автоматическое c уведомление. Информация о лекарствах и количестве ежедневных повторений вводится пользователем.

Так что я хочу сделать для оператора if, он будет сравнивать, является ли текущий час между 7:00 - 20:00. ,

В противном случае оператор должен сравнивать текущий час после 20:00 или нет, если да, то календарь добавит еще 1 день. Так, чтобы приложения выскакивали то же самое уведомление на следующий день в 7:00.

А для оператора else необходимо проверить, является ли текущий час до 7:00 или нет. Если да, приложения будут отображать уведомление сразу после того, как текущий час будет равен 7:00

Но оператор else if не сработал, как я ожидал. Я имею в виду, если я установлю уведомление прямо сейчас, в 22:00, приложения не уведомят меня на следующий день (в 7:00).

Итак, я хотел бы спросить, может ли кто-нибудь из вас помочь мне исправить мой код, как показано ниже. Сегмент if и else работает нормально. Но в противном случае утверждение кажется не сработает.

 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Calendar calendar = Calendar.getInstance();
Calendar now = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());

//repeat on 7am
calendar.set(Calendar.HOUR_OF_DAY, 7);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 0);

//check current hour
int timeOfDay = now.get(Calendar.HOUR_OF_DAY);

//to check if current hour is after 7pm
Calendar later = Calendar.getInstance();
later.set(Calendar.HOUR_OF_DAY, 20);
later.set(Calendar.MINUTE, 00);
later.set(Calendar.SECOND, 0);

if (timeOfDay >= 7 && timeOfDay <= 20) {
    //notification's process
}

else if (now.after(later)) {
        Log.d("Hey", "Added a day");
        calendar.add(Calendar.DATE, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 7);
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 0);

        this.context = context;
        prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
        nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notification = new NotificationCompat.Builder(context);
        name = prefs.getString("name" + count, "");
        hours = prefs.getInt("hora" + count, 8);
        minutes = prefs.getInt("minuto" + count, 0);


        Intent newIntentKill = new Intent(context, Broadcast.class);
        Bundle saco = new Bundle();
        saco.putInt("count", count);
        saco.putBoolean("shownBefore", true);
        newIntentKill.putExtras(saco);

        PendingIntent pendingIntentKill = PendingIntent.getBroadcast(context, count, newIntentKill, PendingIntent.FLAG_UPDATE_CURRENT);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
               alarmManager.setExact(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntentKill);

         } else {
               alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntentKill);
         }

            Log.d("Alarm", "Alarms set for everyday 7 am.");
    }

else {

    this.context = context;
    prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
    nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notification = new NotificationCompat.Builder(context);
    name = prefs.getString("name" + count, "");
    hours = prefs.getInt("hora" + count, 8);
    minutes = prefs.getInt("minuto" + count, 0);


    Intent newIntentKill = new Intent(context, Broadcast.class);
    Bundle saco = new Bundle();
    saco.putInt("count", count);
    saco.putBoolean("shownBefore", true);
    newIntentKill.putExtras(saco);

    PendingIntent pendingIntentKill = PendingIntent.getBroadcast(context, count, newIntentKill, PendingIntent.FLAG_UPDATE_CURRENT);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           alarmManager.setExact(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntentKill);

     } 
     else {
           alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntentKill);
         }

     Log.d("Alarm", "Alarms set for everyday 7 am.");
}

Итак, заранее благодарю за помощь. Я был бы очень признателен.

1 Ответ

0 голосов
/ 05 апреля 2020

java .time и ThreeTenABP

Я предлагаю использовать java .time, современный Java API даты и времени, для вашей работы с датой и временем. С ним гораздо приятнее работать, чем со старым и плохо спроектированным классом Calendar, и, как правило, он не доставляет столько неприятных сюрпризов. Ваша схема if / else может, например, go выглядеть следующим образом:

    ZoneId zone = ZoneId.systemDefault();
    ZonedDateTime nowZdt = ZonedDateTime.now(zone);
    LocalTime now = nowZdt.toLocalTime();
    if (now.isBefore(LocalTime.of(20, 0))) {
        if (now.isBefore(LocalTime.of(7, 0))) {
            // Set alarm for 7 today
            long alarmTimeMillis = nowZdt.with(LocalTime.of(7, 0))
                    .toInstant()
                    .toEpochMilli();
            // Set alarm
        } else { // between 7 AM and 8 PM
            // notification's process
        }
    } else { // after 8 PM
        // Set alarm for 7 AM tomorrow
        long alarmTimeMillis = nowZdt.plusDays(1)
                .with(LocalTime.of(7, 0))
                .toInstant()
                .toEpochMilli();
        // Set alarm
    }           

Редактировать: в двух местах в коде alarmTimeMillis - это количество миллисекунд с момента вашей тревоги. Вы можете использовать его вместо calendar.getTimeInMillis() в вызовах alarmManager.set() и alarmManager.setExact().

Что пошло не так в вашем коде?

Я не уверен, что случилось. Возможная проблема, которую я смог обнаружить, находится в этой строке:

if (timeOfDay >= 7 && timeOfDay <= 20) {

Вы сравниваете только час дня и используете <=. Это означает, что когда время 20: что-то, вплоть до 20:59 включительно, условие выполняется. Так что в этом случае вы не попадаете в ветку, где добавляете 1 день. Я не думаю, что это то, что вы намеревались.

Вопрос: Разве java .time не требует Android API уровня 26?

java .time прекрасно работает на как старые, так и новые Android устройства. Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых Android устройствах (от уровня API 26) современный встроенный API -in.
  • В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • Вкл. (Старше) Android используйте версию Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...