如何同时取消和设置AlarmManager

时间:2014-01-31 05:45:12

标签: android android-intent alarmmanager intentservice

我目前正在做的是,使用AlarmManager.SetAlarm(context)启用并AlarmManager.CancelAlarm(context)取消它。我使用的是IntentService

我想要做的是取消触发IntentService的闹钟,然后重新设置,例如:

@Override
protected void onHandleIntent(Intent intent) {
    FooAlarmManager foo = new FooAlarmManager();
    foo.CancelAlarm(FooClass.this);
    //Do some stuff
    foo.SetAlarm(FooClass.this);
}

为什么我这样做?因为在FooAlarmManager范围内,我从静态类中获取时间,例如:

public void SetAlarm(Context context) {
        Integer minutes = StaticValuePass.getMins();
        AlarmManager am = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, FooAlarmManager.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), 1000 * minutes*60, pi);
}

我正在设置onHandleIntent()的时间值。所以基本上我在onHandleIntent()内进行一些检查,并确定何时应该是下一个警报。

不幸的是,我上面的代码不起作用,原因是当你使用setAlarm()时,它实际上会立即调用onHandleIntent()

所以在这种情况下我有两个问题, 1)我可以阻止setAlarm()在首次创建时调用onHandleIntent()吗?

2)(假设上述方法不起作用)如何更改闹钟间隔时间?

1 个答案:

答案 0 :(得分:1)

第二个参数,当前为System.currentTimeMillis(),是您希望重复闹钟首次关闭的时间。因此将其设置为当前时间将立即触发警报。将其设置为System.currentTimeMillis() + (1000 * minutes * 60)可以解决您的问题。

请参阅文档:https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,+long,+long,+android.app.PendingIntent)