澄清AlarmManager的行为

时间:2014-06-18 19:06:07

标签: android android-intent alarmmanager

我有这个静态辅助函数,用于设置每日重复警报:

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);

  4. 问题:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  1. 只要PendingIntent相同,android就只会触发一次警报。您可以根据需要多次设置闹钟,无论您想要什么样的活动/课程。

  2. 一。

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