由 Alarm Manager 触发的 Pending Intent 似乎会立即触发
Pending Intent triggered by Alarm Manager seems to fire right away
我已经设置了一个警报管理器,它应该在一天中的特定时间触发一个待处理的 Intent。
我将代码放在 Main Activity 的 onCreate() 方法中,因为我认为这是放置它的最佳位置?
代码如下:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
final Intent updateIntent = new Intent(Intent.ACTION_MAIN, null);
updateIntent.addCategory(Intent.CATEGORY_HOME);
final ComponentName cn = new ComponentName(
"com.example.myotherapp",
"com.example.myotherapp.MainActivity");
updateIntent.setComponent(cn);
updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, updateIntent, 0);
AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); // launch at 4am, then every day (24 hours)
警报管理器有效,我可以看到它在指定的时间触发,但似乎只要这个基础应用程序启动就会触发 Pending Intent。
是什么导致 Intent 立即触发?我怎样才能阻止它这样做?
您将闹钟设置为今天凌晨 4 点触发,而不是明天。因为那个时间已经过去了,警报会立即触发。
你的问题在这里:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.getTimeInMillis() 将 return 当前时间戳 (System.currentTimeMillis()) 之前的时间戳,这就是警报立即触发的原因。
解决您的问题:
long triggerTime = calendar.getTimeInMillis();
if (triggerTime <= System.currentTimeMillis() + 3000)
{
// 3 Second distance
calendar.add(Calendar.DATE, 1); // Add 1 day --> Trigger 1 day later from now
}
如果您总是想在 1 天后的凌晨 4 点启动闹钟。您可以删除条件并这样做:
calendar.add(Calendar.DATE, 1); // Add 1 day --> Calendar time will be tomorrow 4am
和
alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent);
我已经设置了一个警报管理器,它应该在一天中的特定时间触发一个待处理的 Intent。
我将代码放在 Main Activity 的 onCreate() 方法中,因为我认为这是放置它的最佳位置?
代码如下:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
final Intent updateIntent = new Intent(Intent.ACTION_MAIN, null);
updateIntent.addCategory(Intent.CATEGORY_HOME);
final ComponentName cn = new ComponentName(
"com.example.myotherapp",
"com.example.myotherapp.MainActivity");
updateIntent.setComponent(cn);
updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, updateIntent, 0);
AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); // launch at 4am, then every day (24 hours)
警报管理器有效,我可以看到它在指定的时间触发,但似乎只要这个基础应用程序启动就会触发 Pending Intent。
是什么导致 Intent 立即触发?我怎样才能阻止它这样做?
您将闹钟设置为今天凌晨 4 点触发,而不是明天。因为那个时间已经过去了,警报会立即触发。
你的问题在这里:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.getTimeInMillis() 将 return 当前时间戳 (System.currentTimeMillis()) 之前的时间戳,这就是警报立即触发的原因。
解决您的问题:
long triggerTime = calendar.getTimeInMillis();
if (triggerTime <= System.currentTimeMillis() + 3000)
{
// 3 Second distance
calendar.add(Calendar.DATE, 1); // Add 1 day --> Trigger 1 day later from now
}
如果您总是想在 1 天后的凌晨 4 点启动闹钟。您可以删除条件并这样做:
calendar.add(Calendar.DATE, 1); // Add 1 day --> Calendar time will be tomorrow 4am
和
alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent);