警报管理器延迟警报响铃的问题
problem with alarm manager delay in alarm ringing
我遇到了一个问题,当我设置时间时,闹钟响起有延迟。有时闹钟也会提早响起。我不确定我哪里做错了。希望有人能帮我解决这个问题。
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("%02d:%02d ", 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);
}
这是 AlarmManager.setRepeating
中描述的预期行为:
As of API 19, all repeating alarms are inexact. If your application needs precise delivery times then it must use one-time exact alarms, rescheduling each time as described above.
setRepeating
等于 API 上面的 setInexactRepeating
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
来创建用于播放声音的 mediaPlayer 并且还触发 runnable.run()
导致 Runnable
至 运行。当 运行nable 被触发时,mediaPlayer 运行s 并播放声音然后 handler.postDelayed
设置为在 1 小时(3600000 毫秒)内再次重复 Runnable 的任务,这是无限重复或直到你杀死 运行nable.
我遇到了一个问题,当我设置时间时,闹钟响起有延迟。有时闹钟也会提早响起。我不确定我哪里做错了。希望有人能帮我解决这个问题。
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("%02d:%02d ", 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);
}
这是 AlarmManager.setRepeating
中描述的预期行为:
As of API 19, all repeating alarms are inexact. If your application needs precise delivery times then it must use one-time exact alarms, rescheduling each time as described above.
setRepeating
等于 API 上面的 setInexactRepeating
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
来创建用于播放声音的 mediaPlayer 并且还触发 runnable.run()
导致 Runnable
至 运行。当 运行nable 被触发时,mediaPlayer 运行s 并播放声音然后 handler.postDelayed
设置为在 1 小时(3600000 毫秒)内再次重复 Runnable 的任务,这是无限重复或直到你杀死 运行nable.