32

我被困住了。当我的应用程序启动时,我想检查我之前设置的警报是否存在。如果没有,那么我想设置它。

我提到了这个解决方案。我试图匹配这样的意图:

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

但它不起作用。还有什么工作?

4

4 回答 4

80

首先,关于如何访问以前创建的警报的小教程:

您可以通过创建具有唯一 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() 方法中重新创建警报。

于 2012-07-14T04:51:44.333 回答
5
  • 当您重新启动您的 Android 设备时,第一个警报将不起作用。
  • 您可以使用布尔共享首选项来检查是否创建了警报。
  • Android 待定意图使用唯一 ID

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

您必须在系统重新启动时使用 Boot Receiver 广播,然后使用相同的请求代码再次创建警报REQUEST_CODE=2344;

于 2012-06-07T10:54:52.393 回答
4

基本上从我的经验来看,如果您使用相同的 Intent 和FLAG_UPDATE_CURRENT,您可以确定不会为相同的意图设置两个警报。您还可以仔细查看与 get 函数一起使用的 FLAG_NO_CREATE,如果具有描述意图的pendingintent 已经存在,则返回null

还要记住对待处理的意图使用相同的请求 ID,因为它们是可区分的。

于 2012-07-10T10:11:34.320 回答
1

根据此处的信息,您似乎无法直接检查警报是否存在,但它们确实提供了一些解决方法。

于 2012-07-11T02:10:06.943 回答