如何设置AlarmManager闹钟以避免重复?

5
我对Android还比较新,所以请原谅我的天真。
我正在开发的应用程序需要每小时唤醒并进行一些后台数据收集。 我使用AlarmManager设置重复闹钟来启动服务。
目前,我正在MainActivityonCreate方法中设置闹钟。 我担心如果应用程序关闭并重新打开,并且再次调用onCreate方法,则会重复设置闹钟。 我的假设是错误的吗?
我正在考虑规避此问题的一种方法是在SharedPreferences中使用布尔值。 是否有更标准的方法来解决这个问题?
谢谢!

我认为用户应该有选择设置闹钟的选项,而不是在onCreate方法中自动创建闹钟。这样,用户可以决定是否设置多个闹钟。 - krikara
2个回答

5
您可以设置一次性闹钟,避免任何问题重复。
  1. 您可以在操作系统完成引导后静态设置广播接收器通过PendingIntent.getService()注册挂起的意图,并在接收器的onReceive()方法中配置AlarmManager。

  2. 请注意,每个方法PendingIntent.getBroadcast(),PendingIntent.getService(),PendingIntent.getActivity()或PendingIntent.getActivities()都有标志参数。您可以使用PendingIntent.FLAG_NO_CREATE标志请求PendingIntent。这意味着如果系统已经注册了相同的PendingIntent,则会返回null。否则会创建新的PendingIntent实例。因此,您可以依赖此标志来检查是否已经设置了闹钟。

请阅读我对类似问题的回答中关于PendingIntent的更多信息,请(Usage of PendingIntent.cancel() and AlarmManager.cancel())。

基本上,您仍然可以通过首先检查您是否有已注册的PendingIntent来信任启动活动中设置闹钟,并设置PendingIntent.FLAG_NO_CREATE

希望您现在了解该如何操作。


2
关于第二点,如果我对文档的理解是正确的,那么你的理解是相反的。如果Intent尚未注册,将返回Null,而不是已经注册的情况下返回Null。 https://developer.android.com/reference/android/app/PendingIntent.html#FLAG_NO_CREATE - aaronmarino

3

啊,我明白了!谢谢。那很有道理。你认为onCreate是做这样事情的正确位置吗?再次感谢。 - user908015
如果您有一个更适合的Application类,那就更好了。此外,闹钟在每次重启时都会被清除,因此您需要一个BroadcastReceiver来监听完成引导广播,以便可以重置您的闹钟。 - Sam Dozor
如果(!TextUtils.isEmpty(userId) && alarmManager == null){alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(MainScreenActivity.this, AlarmReceive.class); pendingIntent = PendingIntent.getBroadcast(MainScreenActivity.this, 0, intent, 0); alarmManager.cancel(pendingIntent); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), Constants.trackTimeInterval, pendingIntent); // 每60分钟 }这样做对吗? - Shailendra Madda

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