Android AlarmManager问题:设置和重置闹钟的问题

11

我使用Alarm来从服务器获取数据。 我想给用户提供启动和停止Alarm的选项。 这意味着我必须检查并确定Alarm是否已经设置。 我找到了一些代码,可以告诉我Alarm是否已经设置:

Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_NO_CREATE);
found = (P!=null);
如果闹钟已经设置,我会取消它,但如果它没有被设置,那么我会设置它(就像一个开关)。
问题是这只能工作一次。第一次上面的代码检查现有闹钟将返回空值,表示没有闹钟,但在我取消闹钟一次之后,它会返回指向某个东西的指针,但是闹钟并没有运行。
这是设置闹钟的代码。
am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, P); 

这里是取消闹钟的代码:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(P);

我在取消闹钟后是否需要重置某些内容,以使其 PendingIntent 被清除?


1
我不太确定为什么你要检查警报是否已经存在。你能解释一下你的理由吗? - dave.c
我想要一个可以作为开关的按钮。同时,如果我的应用程序崩溃导致闹钟设置丢失,我也希望使用该按钮作为指示器。我使用闹钟来更新小部件,当用户单击小部件时,它会打开一个活动,在那里用户可以查看闹钟是否已设置。我担心的是,我设置了闹钟后它会被关闭,用户将不知道它已关闭。 - Kemal
1个回答

53

取消 AlarmManager 时,不要使用带有FLAG_CANCEL_CURRENT标志的 PendingIntent。 相反,在取消闹钟后明确地取消 PendingIntent

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
am.cancel(p);
p.cancel();

1
这篇文章应该得到+50的赞,因为其他帖子都没有涉及取消PendingIntentAlarmManager,而我正在使用(PendingIntent.getBroadcast(getBaseContext(), 0, checkIntent, PendingIntent.FLAG_NO_CREATE) != null);来检查我的闹钟是否在运行,这是唯一一个不需要重新启动我的活动就能正常工作的方法。干得好! - midiwriter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接