pendingAlarmIntent.cancel()或AlarmManager.cancel(pendingAlarmIntent)?

时间:2013-04-24 21:37:09

标签: android alarmmanager android-pendingintent android-alarms

我只是在看如何取消闹钟,我遇到了这两种方法。应该在哪种情况下使用哪一个?为什么?他们俩都一样吗?

我目前正在这样做:

Intent alarmIntent = new Intent(ChangeAlarmActivity.this, AlarmReceiver.class);                         
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(ChangeAlarmActivity.this, (int)alarm.getID(),
        alarmIntent, 0);
pendingAlarmIntent.cancel();

下面的内容有何不同?

Intent alarmIntent = new Intent(ChangeAlarmActivity.this, AlarmReceiver.class);                         
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(ChangeAlarmActivity.this, (int)alarm.getID(),
        alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingAlarmIntent);

1 个答案:

答案 0 :(得分:1)

  

他们俩都一样吗?

没有

如果您要取消闹钟,请拨打cancel()上的AlarmManager

cancel()上的{p> PendingIntent可能会产生相同的效果 - 无论您的警报事件应该触发什么都不再发生。但是,您假设AlarmManager将检测到这一点并清理它的一面,这是不能保证的。特别是对于_WAKEUP警报,这可能导致设备被无故唤醒,浪费电池寿命。

  

在什么情况下应该使用哪一个?为什么?

我确信cancel()上的PendingIntent有用例。我不能说出任何具体的,因为我从未见过它。通常当您使用PendingIntent时,任何“取消”语义都在PendingIntent使用上(例如,cancel()警报通过{{1} ,AlarmManager通过cancel()发送通知,而不是NotificationManager本身。

PendingIntent cancel()的一个地方因此会在某个地方传递PendingIntent并且没有“取消”来还原,或者您明确希望使用PendingIntent作为还原机制。例如,如果您要创建某种插件机制,并且该插件会向主机应用发送cancel(),则该插件可能会使用PendingIntent来表示“停止使用该cancel()”,主机应用程序在下次尝试PendingIntent send()时会发现并获得异常。就个人而言,我不是这方面的忠实粉丝 - 在PendingIntent行中,如果主机应用无法正确处理这种情况,您不知道主机应用可以使用哪些资源。但是,如果使用得当,它肯定可以工作。

  

下面的内容有何不同?

我建议你使用“下面”一个。