【问题标题】:Clarifications on the behavior of the AlarmManager澄清 AlarmManager 的行为
【发布时间】:2014-06-30 05:26:32
【问题描述】:

我有这个静态辅助函数,用来设置每天重复的闹钟:

public static void setAlarm(Context context, int hh, int mm)
{
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hh);
    calendar.set(Calendar.MINUTE, mm);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intentAlarm = new Intent(context, AlarmReciever.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intentAlarm, 0);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
}

我在三个地方调用了这个辅助函数:

  1. 当设备启动时,我想重新注册闹钟:

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            setAlarm(context, 7, 00);
        }
    }
    
  2. 在我的一项活动中,将其命名为 ActivityA:

    AlarmReciever.setAlarm(ActivityA.this, 7, 00);

  3. 在另一个活动中,将其称为 ActivityB:

    AlarmReciever.setAlarm(ActivityB.this, 7, 00);

问题:

  1. 如果调用所有三种 setAlarm() 会发生什么?我担心他们没有相同的上下文。 android会知道它们是相同的PendingIntent并且只触发一次吗?我希望它只在早上 7 点触发一次。

  2. 如果我在 ActivityA 中按 setAlarm 按钮几次,以相同的上下文和意图设置相同的警报,当早上 7 点到来时,会触发多少次?

  3. 假设它在今天早上 7 点发射,现在是下午 2 点。我现在按下 ActivityA 中的按钮。警报会立即触发(经过测试),因为早上 7 点是“过去时间”。但是在添加新警报之前,系统不应该检查现有警报,并意识到这是重复意图,并且已经在早上 7 点发出警报吗?在我看来,它应该忽略我在下午 2 点请求的 setAlarm()。

【问题讨论】:

    标签: android android-intent alarmmanager


    【解决方案1】:

    为了它的价值,我做了实验,我在这里发布结果以防其他人想知道:

    1. 只要PendingIntent 相同,android 只会触发一次警报。您可以在任何活动/课程中设置任意次数的闹钟。

    2. 一个。

    3. 新警报会以正确的方式触发(因为早上 7 点是“过去时间”)。您可以编写代码来记录上次触发的日期/小时(例如,使用SharedPreferences),并在那里执行一些逻辑,或者根据您的情况,您可能希望将警报安排在第二天早上 7 点触发(执行再加上一天 Calendar 对象)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多