【问题标题】:Is there any way to check if an alarm is already set?有什么方法可以检查是否已经设置了闹钟?
【发布时间】:2012-06-07 10:30:04
【问题描述】:

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

我提到了this solution。我试图匹配这样的意图:

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

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

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

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

    您可以通过创建具有唯一 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

    This answer 将帮助您了解如何做到这一点。只需按照上面的建议在 BroadcastReceiver 的 onReceive() 方法中重新创建警报。

    【讨论】:

    • 嗨,感谢您的工作...但是如果我没有活动会怎样..那么我的启动完成广播接收器在这种情况下将无法工作(Android 3.0 版本以上的情况)...那么如何想出它..因为我正在开发这样一个他们不想要任何活动的应用程序......所以如何注册那个接收器..
    • 你只需要使用 标签。看看这个:developer.android.com/guide/topics/manifest/…。如果您使用服务来创建警报,则需要将上面的活动名称更改为您的服务类名称。
    • 很高兴它有帮助。我可以通过点击绿色检查下的赏金来获得我承诺的赏金吗?否则,您为赏金而牺牲的所有积分都将一文不值。 ;)
    【解决方案2】:
    • 当您重新启动您的安卓设备时,第一个警报将不起作用。
    • 您可以使用布尔共享首选项来检查警报是否已创建。
    • 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;再次创建警报

    【讨论】:

    • 嘿,这看起来是个好建议,但基本问题仍然存在。如何检查它是否已经设置好?如果有检查程序,那么我应该在哪里为它编写代码?我的意思是当我的应用程序启动或任何其他活动时?请帮帮我..
    【解决方案3】:

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

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

    【讨论】:

    • Szczygiel 非常真实,我的经验也表明,当使用相同的意图并使用 setInexactRepeating 时,FLAG_UPDATE_CURRENT 有效......
    【解决方案4】:

    根据here 的信息,您似乎无法拨打电话直接检查是否存在警报,但他们确实提供了一些解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-31
      • 2012-07-02
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多