проблема с задержкой диспетчера сигналов тревоги при подаче сигнала тревоги

#android #android-layout #timepicker #android-timepicker

#Android #android-макет #таймер #android-timepicker

Вопрос:

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

 public void showHourPicker(View view) {


    currentHour = calendar.get(Calendar.HOUR_OF_DAY);
    currentMinute = calendar.get(Calendar.MINUTE);

    timePickerDialog = new TimePickerDialog(MainActivity.this, android.R.style.Theme_Holo_Light_Dialog_NoActionBar, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int hourOfDay, int minutes) {

            if (hourOfDay >= 12) {
                amPm = "PM";
            } else {
                amPm = "AM";
            }
            txtTime.setText(String.format("d:d ", hourOfDay, minutes)   amPm);

            calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
            calendar.set(Calendar.MINUTE,minutes);
        }

    }, currentHour, currentMinute, false);

    timePickerDialog.setTitle(" Your Expected Time : "   exp.getText());
    timePickerDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
    timePickerDialog.show();

    startAlarm(calendar);

}

public void startAlarm(Calendar calendar) {

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, MyBroadcastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);

}
  

Ответ №1:

Это предполагаемое поведение, описанное в AlarmManager.setRepeating :

Начиная с API 19, все повторяющиеся сигналы тревоги являются неточными. Если вашему приложению требуется точное время доставки, то оно должно использовать одноразовые точные сигналы тревоги, перепланируя каждый раз, как описано выше.

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

1. поэтому я должен использовать AlarmManager.setExact (AlarmManager. RTC,calendar.getTimeInMillis(), PendingIntent); Вот так?

2. Да — и вы можете запланировать следующий точный сигнал тревоги в вашем широковещательном приемнике, если вам нужно точное повторение.

3. когда я пытаюсь, он не звонит

Ответ №2:

setRepeating соответствует setInexactRepeating приведенному выше API 19. Если вы хотите повторить это точно через определенный интервал, используйте handler.postDelayed в своем широковещательном приемнике. Я прикрепил один из моих кодов широковещательного приемника с такой же реализацией

 public class AlertReceiver extends BroadcastReceiver {
private MediaPlayer alarmRinger;
@Override
public void onReceive(Context context, Intent alarmIntent) {
   alarmRinger = MediaPlayer.create(context, R.raw.alarmringer);
   runnable.run();
   }
private final Handler handler = new Handler();
private final Runnable runnable = new Runnable() {
    @Override
    public void run() {
        alarmRinger.start();
        handler.postDelayed(this, 3600000);//Change the timing accordingly in MS 
    }
};
  

}

Здесь мой AlarmManager запускает широковещательный приемник, а затем широковещательный приемник запускает MediaPlayer создание медиаплеера для воспроизведения звука, а также запускает, runnable.run() который вызывает Runnable запуск. При запуске runnable медиаплеер запускается и воспроизводит звук, а затем handler.postDelayed устанавливается на повторение задачи Runnable снова через 1 час (3600000 мс), это повторяется бесконечно или до тех пор, пока вы не отключите runnable.