Лучшая практика для ежедневной тревоги? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть приложение с будильником, в котором есть функция одновременной установки ежедневных будильников (часы и минуты).

Итак, для этого я планирую повторяющееся событие, которое должно происходить каждый час, чтобы убедиться, что следующий будильник сработает в этот день.

 AlarmManager alarmMgr;
        PendingIntent alarmIntent;
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, BootBroadcastReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 9998, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    Calendar.getInstance().getTimeInMillis() + 5000,
                    AlarmManager.INTERVAL_HOUR, alarmIntent);

        } else {
            alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                    Calendar.getInstance().getTimeInMillis() + 5000,
                    AlarmManager.INTERVAL_HOUR, alarmIntent);
        }

А внутри класса BootBroadcastReceiver я запускаю JobIntentService, который обеспечивает работу следующего аварийного сигнала и проверил логику его правильной работы на большинстве устройств.

Это часть, где я устанавливаю реальные сигналы тревоги внутри JobIntentService.

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
        } else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmMgr.setExact(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
        } else {
            alarmMgr.set(AlarmManager.RTC_WAKEUP, milliSeconds, alarmIntent);
        }

Однако на одном из устройств, на котором установлено мое приложение, не было звонка будильника в назначенное время, это произошло через 3 недели после установки моего приложения на это устройство!

Итак, у меня есть 3 вопроса:

1- Является ли моя общая логика лучшим способом справиться с ежедневной тревогой или есть лучший подход?

2- Устройство, сообщившее о проблеме, не вызывающей сигнал тревоги, является Android KitKat (v4.4), может ли мой код иметь недостатки с версией KitKat?

3-Как вы знаете, когда вы перезапускаете устройство, вещательный приемник, который вы установили с помощью alarmmanger, срабатывает, даже если это было не то время, которое вы запланировали, поэтому, чтобы избежать срабатывания будильника в неправильное время, я проверяю текущие часы и минут, и сравните его с кэшированными значениями тревоги внутри класса приемника широковещания, запускаемого менеджером тревоги.

Так может ли трансляция не быть запущена в точные минуты? и поэтому моя логика проверки минут отклоняет сигнал тревоги?

например, если я поставлю будильник на 12:30, может ли трансляция сработать в 12:29 или 12:31?

Затем я проверяю текущие минуты и часы и нахожу текущие минуты 29 или 31 вместо 30, поэтому аварийные сигналы не работают?

Вот мой чек внутри приемника вещания:

 Calendar alarmCalendar = Calendar.getInstance();
            alarmCalendar.setTimeInMillis(alarmTimeStamp);
            int alarmMinutes = alarmCalendar.get(Calendar.MINUTE);
            int alarmHour = alarmCalendar.get(Calendar.HOUR_OF_DAY);
            Calendar nowCalendar = Calendar.getInstance();
            int nowMinutes = nowCalendar.get(Calendar.MINUTE);
            int nowHour = nowCalendar.get(Calendar.HOUR_OF_DAY);
            if (nowHour != alarmHour || nowMinutes != alarmMinutes) 
    return; 
...