由警报管理器触发的待定意图似乎立即开始

时间:2015-04-09 15:00:16

标签: java android android-intent

我已经设置了一个警报管理器,它应该在一天的特定时间触发一个待处理的意图。

我将代码放在我的主要活动的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在这个基础应用程序启动后立即被触发。

是什么导致意图立即开火?我怎么能阻止它这样做呢?

2 个答案:

答案 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点触发,而不是明天触发。由于该时间已经过去,警报会立即触发。