我有一个名为BroadcastReceiver
的{{1}} AlarmReceiver
s“警报有效”。我正在尝试设置重复的Toast
以在5:45和17:30触发PendingIntent
,但是在启动应用程序几秒钟后我看到“闹钟工作”。为什么AlarmReceiver
会立即发送?
PendingIntent
AlarmReceiver:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, 05);
cal1.set(Calendar.MINUTE, 45);
cal1.set(Calendar.SECOND, 00);
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, 17);
cal2.set(Calendar.MINUTE, 30);
cal2.set(Calendar.SECOND, 00);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(),cal2.getTimeInMillis(), pi);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:9)
但是在我的应用程序启动几秒后,我看到“闹钟工作”。
我相信你收到第一个警报就好了。
但你相信它不会重复。这是错误的,将重复......每〜43年一次。您错误地使用了setRepeating
的第三个参数,请尝试:
Calendar cal1 = Calendar.getInstance(); // Now
cal1.add(Calendar.SECONDS, 5); // Change to five seconds from now
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cal1.getTimeInMillis(),
10000, /* Repeat every 10 seconds */
pi);
第三个参数是 interval 。此代码创建一个在5秒内熄灭的警报,然后每10秒重复一次。通过使用cal2
,您不小心将间隔设置为将近43年。
要设置两个不同的闹钟,请使用:
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, 05);
cal1.set(Calendar.MINUTE, 45);
cal1.set(Calendar.SECOND, 00);
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, 17);
cal2.set(Calendar.MINUTE, 30);
cal2.set(Calendar.SECOND, 00);
// Test if the times are in the past, if they are add one day
Calendar now = Calendar.getInstance();
if(now.after(cal1))
cal1.add(Calendar.HOUR_OF_DAY, 24);
if(now.after(cal2))
cal2.add(Calendar.HOUR_OF_DAY, 24);
// Create two different PendingIntents, they MUST have different requestCodes
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent morningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
PendingIntent eveningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, 0);
// Start both alarms, set to repeat once every day
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, morningAlarm);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, eveningAlarm);
答案 1 :(得分:3)
正如Sam's post所述,您没有使用正确的triggerAtMillis
和intervalMillis
。我认为你告诉它在当天早上5点触发,这可能在过去,在这种情况下,documentation表示
Calendar cal1 = Calendar.getInstance();
cal1.add(Calendar.HOUR, 5);
cal1.add(Calendar.MINUTE, 45);
long interval = 17 * 60 * 60 * 1000; // 17 hours converted to milliseconds
interval += 30 * 60 * 1000; // 30 minutes converted to milliseconds
Intent intent = new Intent(this, TestAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), interval, pi);
可能是您想要做的事情。
编辑(更多解释):
cal1.add(Calendar.HOUR, 5);
获取当前日期和时间并将其增加5小时,因此结果是重复PendingIntent
将从此日期的当前时间开始5小时45分钟。并且interval
表示它将从那时起每隔17小时30分钟发送第二个及以后的PendingItent
(此时距离现在为5小时45分钟)。
如果您想将开始时间设置为早上5:45,但不希望立即发送(除非恰好是当前上午5:45)。那么你会想要设置:
cal1.set(Calendar.HOUR, 5);
cal1.set(Calendar.MINUTE, 45);
cal1.set(Calendar.SECOND, 0);
// Current time is after 5:45 am, don't start until tomorrow at 5:45
if (Calendar.getInstance().after(cal1))
cal1.add(Calendar.DAY_OF_YEAR, 1)
或者,您可以计算从该时间开始的时间间隔,以确定它将在下一次触发,假设它已经在5:45启动,但这需要更多的工作来计算。