Android 如何取消这个重复的闹钟?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3330522/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to cancel this repeating alarm?
提问by Wen
I'm writing something like a reminder for users. Users will set reminders for their events, when the time comes, a repeating alarm will be set to trigger a status bar notification. But the alarm seems non-stop after I selected the notification or cleared the notification. I am not sure where to cancel this repeating alarm. Below are some of the codes: Set up the repeating alarm in my main activity
我正在写一些类似提醒用户的东西。用户将为他们的事件设置提醒,当时间到时,将设置重复警报以触发状态栏通知。但是在我选择通知或清除通知后,警报似乎没有停止。我不知道在哪里取消这个重复的闹钟。以下是一些代码: 在我的主要活动中设置重复闹钟
alarmTime = Calendar.getInstance();
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmTime.add(Calendar.MINUTE,offset_time);
//Schedule the alarm
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender);
In my OnReceive method, I just display the notification in status bar and set the flag as FLAG_AUTO_CANCEL
在我的 OnReceive 方法中,我只是在状态栏中显示通知并将标志设置为 FLAG_AUTO_CANCEL
manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0);
notification.flags = Notification.FLAG_AUTO_CANCEL;
manager.notify(R.string.service_text, notification);
How can I stop the alarm when the user selects the notification or clears it?
当用户选择通知或清除通知时,如何停止警报?
回答by CommonsWare
Call cancel()
on AlarmManager
with an equivalent PendingIntent
to the one you used with setRepeating()
:
电话cancel()
上AlarmManager
用等效PendingIntent
于你所使用的一个setRepeating()
:
Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);
回答by Ramin Fallahzadeh
I tried various methods and couldnt get it to work, so I decided to do a dirty trick. When I want to cancel my repeating alarm, I use the same method that created my alarm (and hence replacing the old one) and then cancel it right away. With this method if the boolean variable is set to true it creates an alarm ow it replaces and then cancels the replacement which has the same id:
我尝试了各种方法都无法奏效,所以我决定做一个肮脏的把戏。当我想取消重复闹钟时,我会使用创建闹钟的相同方法(因此替换旧闹钟),然后立即取消。使用此方法,如果布尔变量设置为 true,它会创建一个警报流,它会替换并取消具有相同 ID 的替换:
static void CancelRepeatingAlarm(Context context, boolean creating){
//if it already exists, then replace it with this one
Intent alertIntent = new Intent(context, AlertReceiver.class);
PendingIntent timerAlarmIntent = PendingIntent
.getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (creating){
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent);
}else{
alarmManager.cancel(timerAlarmIntent);
}
回答by Sunil Chaudhary
In your MainActivity
, set the alarm time. If you're going to use multiple alarms, use SharedPreferences
to store their respective IDs. Here is the code:
在您的 中MainActivity
,设置闹钟时间。如果您要使用多个警报,请使用SharedPreferences
来存储它们各自的 ID。这是代码:
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
pendingIntent);
public static Context getContext() {
return mContext;
}
mContext=mainactivity.this;
In your second Activity
use same ID from SharedPreferences
. In my code, I get the ID from the ArrayList, Alarm_id
. Last, you can use the MainActivity context here with MainActivity.getContext()
. Here is the code:
在您的第二次Activity
使用相同的 ID 中SharedPreferences
。在我的代码中,我从 ArrayList 中获取 ID,Alarm_id
. 最后,您可以在此处将 MainActivity 上下文与MainActivity.getContext()
. 这是代码:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intentAlarm = new Intent(AlarmListviewActivity.this,
MainActivity.class);
PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon),
intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(morningIntent);
morningIntent.cancel();