我只是在研究如何取消警报,而我遇到了这两种方法。在什么情况下应使用哪一种?为什么?他们俩都一样吗?
我目前正在这样做:
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/