我已经设置了一个警报管理器,它应该在一天的特定时间触发一个待处理的意图。
我将代码放在我的主要活动的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在这个基础应用程序启动后立即被触发。
是什么导致意图立即开火?我怎么能阻止它这样做呢?
答案 0 :(得分:3)
你的问题在这里:
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()将返回当前时间戳(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
}
如果你总想在凌晨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);
答案 1 :(得分:1)
您将警报设置为今天凌晨4点触发,而不是明天触发。由于该时间已经过去,警报会立即触发。