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

我目前正在这样做:

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

最佳答案

他们俩都一样吗?


没有。

如果要取消警报,请在cancel()上呼叫AlarmManager

cancel()上的PendingIntent可能看起来具有相同的效果-警报事件本应触发的任何事件都不再发生。但是,您然后假设AlarmManager将检测到此情况并从侧面清理东西,这不能保证。特别是对于_WAKEUP警报,这可能会导致设备被无故唤醒,从而浪费电池寿命。


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


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

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


  这和下面有什么不同?


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

关于android - endingAlarmIntent.cancel()或AlarmManager.cancel(pendingAlarmIntent)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16202651/

10-13 06:35