AlarmManager 没有在正确的时间关闭
AlarmManager not going off at correct time
我正在创建一个使用 TimePicker 的应用程序,用户可以设置他们希望将 SMS 发送到指定号码的时间。他们还可以选择单击重复,以便每天在同一指定时间继续发送 SMS。
我的问题是它在我设置定时器后立即关闭,而不是等待。我曾多次尝试打乱间隔,但从逻辑上讲它似乎应该按原样工作,但事实并非如此。
这是从时间选择器获取时间并设置 AlarmManger 的代码:
Button setSchedule = (Button) setTimer.findViewById(R.id.setSchedule);
setSchedule.setText("Set");
setSchedule.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
hours = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();
minutesConv += hours * 60;
minutes += minutesConv;
seconds = minutes * 60;
time = seconds * 1000;
long currentTime = System.currentTimeMillis();
CheckBox repeat = (CheckBox) setTimer.findViewById(R.id.repeat);
Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(MainMenu.this, 0, intentAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
if (repeat.isChecked())
{
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time - currentTime, AlarmManager.INTERVAL_DAY, pi);
}//end if
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, time - currentTime, PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
}//end else
Toast.makeText(MainMenu.this, "Your message has been scheduled to be repeated at " +
hours + ":" + minutes, Toast.LENGTH_SHORT).show();
setTimer.dismiss();
}//end onClick
});
编辑:
Calendar cal = Calendar.getInstance();
Calendar current = Calendar.getInstance();
cal.set(0, 0, 0, timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 00);
Toast.makeText(MainMenu.this, "time: " + cal.getTimeInMillis(), Toast.LENGTH_SHORT).show();
CheckBox repeat = (CheckBox) setTimer.findViewById(R.id.repeat);
Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(MainMenu.this, 0, intentAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
if (repeat.isChecked())
{
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
}//end if
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
}//end else
如果我正确读取 documentation,则 triggerAtMillis
参数是绝对时间,而不是相对时间。通过 time + currentTime
而不是 time - currentTime
应该没问题。
因此,问题与正确设置闹钟有关。本质上,当您希望触发警报时,警报管理器设置为以毫秒为单位的绝对时间。你有几个选项来计算这个。
- 在您的代码中使用该方法,您可以在其中获取用户输入的值并计算与 currentTime 的增量(以毫秒为单位)。当用户指定他们想要在未来 X 时间量内发出警报时,这很有用。
- 使用此处 RTC 示例下描述的日历方法:https://developer.android.com/training/scheduling/alarms.html
这允许用户为闹钟指定时间或完整日期,而您只需直接从日历对象中获取毫秒值。
尝试为您的日历设置一个闹钟:
hours = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
setTimeInMillis() 将日历对象更新为当前日期(因此年份和所有其他内容都已正确设置)。然后,您将日历设置为同一天的未来时间,并将其传递给警报管理器。
我正在创建一个使用 TimePicker 的应用程序,用户可以设置他们希望将 SMS 发送到指定号码的时间。他们还可以选择单击重复,以便每天在同一指定时间继续发送 SMS。
我的问题是它在我设置定时器后立即关闭,而不是等待。我曾多次尝试打乱间隔,但从逻辑上讲它似乎应该按原样工作,但事实并非如此。
这是从时间选择器获取时间并设置 AlarmManger 的代码:
Button setSchedule = (Button) setTimer.findViewById(R.id.setSchedule);
setSchedule.setText("Set");
setSchedule.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
hours = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();
minutesConv += hours * 60;
minutes += minutesConv;
seconds = minutes * 60;
time = seconds * 1000;
long currentTime = System.currentTimeMillis();
CheckBox repeat = (CheckBox) setTimer.findViewById(R.id.repeat);
Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(MainMenu.this, 0, intentAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
if (repeat.isChecked())
{
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time - currentTime, AlarmManager.INTERVAL_DAY, pi);
}//end if
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, time - currentTime, PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
}//end else
Toast.makeText(MainMenu.this, "Your message has been scheduled to be repeated at " +
hours + ":" + minutes, Toast.LENGTH_SHORT).show();
setTimer.dismiss();
}//end onClick
});
编辑:
Calendar cal = Calendar.getInstance();
Calendar current = Calendar.getInstance();
cal.set(0, 0, 0, timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 00);
Toast.makeText(MainMenu.this, "time: " + cal.getTimeInMillis(), Toast.LENGTH_SHORT).show();
CheckBox repeat = (CheckBox) setTimer.findViewById(R.id.repeat);
Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(MainMenu.this, 0, intentAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
if (repeat.isChecked())
{
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pi);
}//end if
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
}//end else
如果我正确读取 documentation,则 triggerAtMillis
参数是绝对时间,而不是相对时间。通过 time + currentTime
而不是 time - currentTime
应该没问题。
因此,问题与正确设置闹钟有关。本质上,当您希望触发警报时,警报管理器设置为以毫秒为单位的绝对时间。你有几个选项来计算这个。
- 在您的代码中使用该方法,您可以在其中获取用户输入的值并计算与 currentTime 的增量(以毫秒为单位)。当用户指定他们想要在未来 X 时间量内发出警报时,这很有用。
- 使用此处 RTC 示例下描述的日历方法:https://developer.android.com/training/scheduling/alarms.html 这允许用户为闹钟指定时间或完整日期,而您只需直接从日历对象中获取毫秒值。
尝试为您的日历设置一个闹钟:
hours = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT));
setTimeInMillis() 将日历对象更新为当前日期(因此年份和所有其他内容都已正确设置)。然后,您将日历设置为同一天的未来时间,并将其传递给警报管理器。