在哪里放置 AlarmManager for Notifications
Where to place AlarmManager for Notifications
我正在构建一个应用程序,我需要在其中 运行 每 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
有关,但是我还不知道如何使用服务,所以我不太确定
我通常会在事件上启动警报,因此它取决于用户交互而不是 activity 生命周期。例如,当用户按下按钮时,我做了。
如果您不想让他或她启动闹钟,那么您必须使用一项服务并从 activity 调用它,前提是它还没有 运行。
见https://developer.android.com/reference/android/app/Service.html
您的闹钟将拥有自己的生命周期并且不会被重置。
While setting Alarm, you should check if Alarm exists or not. If not
existing that alarm then create new alarm. This way will save you from
creating multiple alarms.
private void setAlarmIfRequired() {
Intent notificationIntent = new Intent(this, NotificationAlarmReceiver.class);
final PendingIntent pendingIntent =
PendingIntent.getBroadcast(this, 0, notificationIntent,
PendingIntent.FLAG_NO_CREATE);
if (pendingIntent == null) {
// There is no alarm set for same
//Set Notifications AlarmManager
AlarmManager AM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
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
}
}
在上面的示例中,我使用了您发布到问题中的代码。
更新 1:最好将此方法移动到实用程序 class 并将其作为静态方法,这样您就可以从 Activity 或您收听设备启动的接收器调用它。
代码会像
public static void setAlarmIfRequired(Context context) {
Intent notificationIntent = new Intent(context, NotificationAlarmReceiver.class);
final PendingIntent pendingIntent =
PendingIntent.getBroadcast(this, 0, notificationIntent,
PendingIntent.FLAG_NO_CREATE);
if (pendingIntent == null) {
// There is no alarm set for same
//Set Notifications AlarmManager
AlarmManager AM = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pending = PendingIntent.getBroadcast(context, 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
}
}
我正在构建一个应用程序,我需要在其中 运行 每 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
有关,但是我还不知道如何使用服务,所以我不太确定
我通常会在事件上启动警报,因此它取决于用户交互而不是 activity 生命周期。例如,当用户按下按钮时,我做了。
如果您不想让他或她启动闹钟,那么您必须使用一项服务并从 activity 调用它,前提是它还没有 运行。
见https://developer.android.com/reference/android/app/Service.html
您的闹钟将拥有自己的生命周期并且不会被重置。
While setting Alarm, you should check if Alarm exists or not. If not existing that alarm then create new alarm. This way will save you from creating multiple alarms.
private void setAlarmIfRequired() {
Intent notificationIntent = new Intent(this, NotificationAlarmReceiver.class);
final PendingIntent pendingIntent =
PendingIntent.getBroadcast(this, 0, notificationIntent,
PendingIntent.FLAG_NO_CREATE);
if (pendingIntent == null) {
// There is no alarm set for same
//Set Notifications AlarmManager
AlarmManager AM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
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
}
}
在上面的示例中,我使用了您发布到问题中的代码。
更新 1:最好将此方法移动到实用程序 class 并将其作为静态方法,这样您就可以从 Activity 或您收听设备启动的接收器调用它。
代码会像
public static void setAlarmIfRequired(Context context) {
Intent notificationIntent = new Intent(context, NotificationAlarmReceiver.class);
final PendingIntent pendingIntent =
PendingIntent.getBroadcast(this, 0, notificationIntent,
PendingIntent.FLAG_NO_CREATE);
if (pendingIntent == null) {
// There is no alarm set for same
//Set Notifications AlarmManager
AlarmManager AM = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pending = PendingIntent.getBroadcast(context, 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
}
}