【问题标题】:Where to place AlarmManager for Notifications在哪里放置警报管理器以获取通知
【发布时间】: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


【解决方案1】:

在设置闹钟时,你应该检查闹钟是否存在。如果不 存在该警报然后创建新警报。这种方式将拯救你 创建多个警报。

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
        }
    }

在上面的示例中,我使用了您发布的代码。


Update1:​​最好将此方法移动到实用程序类并使其成为静态方法,这样您就可以从 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
        }
    }

【讨论】:

  • 所以我的理解是我应该将 PendingIntent 标志更改为 FLAG_NO_CREATE 并在调用警报之前检查 null 但是,我对此有一个问题:我是否仍应在我的 MainActivity 的 onCreate 方法?
  • 现在如果你从Activity调用这个方法没有问题,因为如果没有设置它只会创建警报。但是,是的,您需要寻找更好的地方来优化此方法调用。另一种选择是,如果它符合您的应用程序要求,您可以从“应用程序的 onCreate”中调用此方法。
【解决方案2】:

我通常对事件启动警报,因此它取决于用户交互而不是活动生命周期。例如,当用户按下按钮时,我会这样做。

如果您不想让他或她启动警报,那么您必须使用服务并仅在活动尚未运行时才从活动中调用它。

https://developer.android.com/reference/android/app/Service.html

您的闹钟将拥有自己的生命周期,并且不会被重置。

【讨论】:

  • 我没有启动警报的事件,我只想在应用程序第一次运行后为整个应用程序设置一次
  • 您能否详细说明如何使用服务进行设置?
  • 点击链接,在Android文档中已经足够详细了;)
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多