Почему мой будильник срабатывает раньше, чем мое установленное время? - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время я пытаюсь создать приложение для будильника, которое отключит всю громкость звука в определенные пользователем день и время.Однако сигнал тревоги не срабатывает в нужное время.Я обнаружил, что сигнал тревоги всегда срабатывает раньше.

Это мой установленный код тревоги:

public static void setAlarm(Context context, String time, int day, int reqCode) {
    String[] timeSplit = time.split(":");
    Calendar calendar = Calendar.getInstance();

    int hour = Integer.parseInt(timeSplit[0]);
    int minute = Integer.parseInt(timeSplit[1]);
    int days = (day-calendar.get(Calendar.DAY_OF_WEEK) + calendar.get(Calendar.DAY_OF_MONTH));

    calendar.set(
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            days,
            hour,
            minute,
            0
    );

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, RuleAlarm.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, reqCode, intent, 0);

    // Set the alarm to be fired every week on the selected day
    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingIntent);

    Toast.makeText(context, "Alarm is set", Toast.LENGTH_SHORT).show();
}

Я пытался изменить setRepeating() на setInexactRepeating(), но ничего не изменилось.

Ответы [ 3 ]

0 голосов
/ 06 мая 2019

AlarmManger является неточным, чтобы сэкономить заряд батареи, комбинируя вызовы пробуждения. https://developer.android.com/reference/android/app/AlarmManager.html

Screenshot from https://developer.android.com/reference/android/app/AlarmManager.html

0 голосов
/ 06 мая 2019

Я наконец-то выяснил проблему. Он лежит на day параметрах. То, что я передаю в day params, это моя выбранная Spinner позиция, которая начинается с нуля, а дни календаря начинаются с одного (SUNDAY = 1, MONDAY = 2 и т. Д.). Таким образом, будильник всегда будет установлен в последние дни. Я плюс один к day параметрам, и это сработало.

Это мой кусок кода, где была вызвана функция startAlarm().

String ruleStartTime = rule_startTime.getText().toString();

// Spinner index starts from zero,
// to match with the Calendar day indexing, we need to plus it one
int dayIdx = day.getSelectedItemPosition()+1;

Alarm.setAlarm(getApplicationContext(), ruleStartTime,
                        dayIdx, 0);
0 голосов
/ 06 мая 2019

Попробуйте это

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingIntent);

Проблема заключается в том, что если вы создаете PendingIntent для сигнала тревоги за прошедшее время, он сработает немедленно. Если вы хотите предотвратить это, просто не устанавливайте сигналы тревоги с прошлым временем срабатывания. Используйте BroadcastReceiver для получения тревоги.

Обновление:

Убедитесь, что мы не устанавливаем его в прошлом, что вызвало бы его мгновенный выстрел

    if(calendar.getTimeInMillis() < System.currentTimeMillis()) {
    calendar.add(Calendar.DAY_OF_YEAR, 7);
    }
...