【发布时间】:2016-06-27 13:01:36
【问题描述】:
我正在构建一个应用程序,我需要每 12 小时运行一次检查并相应地发出通知。为此,我使用了一个 AlarmManager,它每 12 小时重复一次,并在满足条件时触发通知:
MainActivity(在onCreate方法内):
//Set Notifications AlarmManager
AlarmManager AM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent notificationIntent = new Intent (this, NotificationAlarmReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.setTimeInMillis(cal.getTimeInMillis() + 5000); //5 Seconds from now
AM.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), AlarmManager.INTERVAL_HALF_DAY , pending); //12 Hour Interval
通知功能正常,但是,我认为将 AlarmManager 放在 onCreate 方法中是错误的,因为现在每次用户打开应用程序时,AlarmManager 都会重置。但是,我不知道在哪里可以启动它,它只会创建一次,而不是每次打开主 Activity 时都重复创建。
我感觉它与Service 有关,但是我还不知道如何使用服务,所以我不太确定
【问题讨论】:
-
您认为 onCreate 不是最佳位置是正确的。
-
是的,我也这么认为,有很多关于
AlarmManager和通知的教程。但我希望其中一个刚刚提到实际放置代码的位置 -
另外,在使用 AlarmManager 时 - 您应该知道 PendingIntents 在设备关闭时被清除。使用 IntentService 来安排警报的任务(仍然是服务,但更简单)。要在设备重新启动时重新安排警报 - 您应该使用 BroadcastReceiver 来监听 Intent.BOOT_COMPLETED - 使用此广播接收器来重新安排您创建的 IntentService。
-
我已经将这个添加到 Manifest 以解决重新调度问题:
-
@apelsoczi 是否保留 AlarmManager 并使用存储在 SharedPref 中的布尔标志来决定是否运行代码是个好主意?
标签: android alarmmanager android-notifications