有没有办法检查是否已经设置了警报?

33

我陷入了困境。当我的应用程序启动时,我想检查之前设置的闹钟是否还在运行。如果没有,在需要的情况下我想设置它。

我参考了这个解决方案。我正在尝试像这样匹配意图:

Intent intent = new Intent();
        intent.setAction("com.vit.upload");
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);

但它没有起作用。还有什么其他的方法可以生效?

4个回答

79
首先,让我们来介绍一下如何访问之前创建的闹钟:

您可以通过为每个闹钟创建唯一的ID来区分闹钟,例如:

Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);

当您想要访问此警报时,必须使用相同的唯一ID创建相同的PendingIntent。例如,以下代码将仅访问您使用PendingIntent ID 1234创建的警报。然后它将取消先前的警报并重置它。
Intent intent = new Intent(this, AlarmReceiverActivity.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi);

这个想法很简单。跟踪id,然后使用它们来访问它们各自的闹钟。如果您使用相同的id创建多个闹钟,则最近创建的一个将取消以前的闹钟。
针对您的主要问题,不要在每次启动应用程序时检查闹钟是否处于活动状态,而是在Activity的onCreate()方法中重新设置它。使用我上面描述的相同PendingIntent即可。这样可以避免检查闹钟是否已经设置或未设置的所有麻烦。由于您的目的是保持闹钟保持活动状态,因此每次启动应用程序时覆盖以前设置的闹钟不会有任何影响。只需确保使用相同的id创建PendingIntent即可。
不要忘记检查您的闹钟时间是否已经过去,以避免尝试为过去的时间设置闹钟,这会立即触发它。
让我们考虑另一种情况:当您关闭设备时,所有闹钟都将被取消。这使您别无选择,只能在重新启动时再次设置它们。要做到这一点,您将需要使用BroadcastReceiver

这个答案将帮助您了解如何操作。只需按照上面建议的方法,在BroadcastReceiver的onReceive()方法中重新创建您的闹钟即可。


嗨,感谢您的工作!但是如果我没有任何活动,那么我的启动完成广播接收器在Android 3.0及以上版本中将无法工作...那该怎么办呢?因为我正在开发这样一个应用程序,他们不想要任何活动...所以如何注册该接收器呢? - NullPointerException
你只需要使用<receiver>标签。请查看:http://developer.android.com/guide/topics/manifest/receiver-element.html 。如果您正在使用服务来创建闹钟,则需要将上面的activity名称更改为您的服务类名称。 - Erol
很高兴能帮上忙。我可以通过点击绿色勾选下面的赏金奖励来获得承诺的赏金吗?否则,你为了赏金所牺牲的所有积分都将白白浪费了。 ;) - Erol

5
  • First alarm will not work when you reboot your android device.
  • You can use the boolean shared preferences to check the alarm is created or not.
  • Android pending intent use the Unique ID

    int REQUEST_CODE=2344; // Unique ID  
    PendingIntent pIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_NO_CREATE);

当系统重新启动时,您需要使用Boot Receiver广播,然后使用相同的请求代码REQUEST_CODE = 2344;创建新的闹钟。


嘿,这看起来像是一个好的建议,但基本问题仍然存在...如何检查它是否已经设置??如果有检查程序,那么我应该在哪里编写代码呢??我的意思是,当我的应用启动或在任何其他活动中时??请帮帮我。 - NullPointerException

4
基本上从我的经验来看,如果您使用相同的Intent和FLAG_UPDATE_CURRENT,您可以确保不会为相同的intent设置两个闹钟。另外,您还可以仔细查看FLAG_NO_CREATE,它与获取函数一起使用,并在具有所述意图的挂起意图已存在时返回null。
还要记得为待处理意图使用相同的请求ID,以使它们可区分。

Szczygiel非常正确,我的经验也表明,当使用相同的意图并使用setInexactRepeating时,FLAG_UPDATE_CURRENT是有效的... - Kunal Shah

1
根据此处提供的信息,似乎没有直接检查警报是否存在的调用方法,但他们提供了一些解决方法。

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