2

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

我目前正在这样做:

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);
4

1 回答 1

1

他们都一样吗?

不。

如果您想取消闹钟,请拨打cancel()AlarmManager

cancel()onPendingIntent可能会出现相同的效果——无论你的警报事件应该触发什么都不再发生。但是,您假设它AlarmManager会检测到这一点并在其一侧进行清理,这是无法保证的。特别是对于_WAKEUP警报,这可能会导致设备被无缘无故地唤醒,从而浪费电池寿命。

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

我确信cancel()onPendingIntent有用例。我无法命名任何具体的,因为我从未见过它使用过。通常,当您使用 a 时PendingIntent,任何“取消”语义都在使用PendingIntent例如,您cancel()通过警报AlarmManager,您cancel()通过通知NotificationManager),而不是在其PendingIntent本身上。

cancel()因此, on 的一个地方PendingIntent是你传递 aPendingIntent并且没有“取消”来恢复它的地方,或者你明确希望cancel()用作恢复机制。例如,如果您正在创建某种插件机制,并且插件向主机PendingIntent应用程序发送一个并得到了例外。就个人而言,我不是这个的忠实拥护者——大致上,如果主机应用程序无法正确处理这种情况,您不知道主机应用程序可能会使用哪些资源。但是,如果使用得当,它当然可以工作。cancel()PendingIntentsend()PendingIntentAlarmManager

这与下面的有什么不同?

“下面”是我建议您使用的。

于 2013-04-24T21:45:16.940 回答