AlarmManager如何传递过去的警报?

时间:2010-12-11 23:07:17

标签: android alarmmanager alarm

我有一个关于在AlarmManager中设置警报的问题。我在文档中找到了一些我不理解的东西(见下文)。我想设置10个警报,触发振铃模式交替静音和正常,所有触发时间都不同。现在设备处于睡眠状态,并在所有10个警报都过时后再次激活。然后AlarmManager会立即广播警报吗?它只是第10个(关于铃声模式怎么样)?

  

报警意图随附一份   int类型的数据额外调用   Intent.EXTRA_ALARM_COUNT表示   表示过去的警报事件数   已经累积到这个意图中   广播。有重复的警报   由于手机没电,所以没有送达   睡着的人数可能大于   交付时一个。

2 个答案:

答案 0 :(得分:3)

最未知的一件事(主要是因为Android文档告诉它"not used at the moment"),如果requestCode不同,PendingIntent将不会被重用。因此,请创建请求代码为0的PI:

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

你可以实现一个计数器并做一些像:

    PendingIntent pendingIntent = PendingIntent.getService(context, counter, intent, 0); 

我知道这适用于短信发送/发送通知PendingIntents,您遇到同样的问题:如果重复使用PendingIntent并且您有超过1个未完成通知,则您将不知道它是哪个短信。 但是很有可能这也可以用于突出警报PendingIntent。

希望这有帮助。

答案 1 :(得分:2)

根据我的理解,在使用警报管理器安排警报时,您必须提供PendingIntent实例。

有两种类型的警报可以唤醒,即使手机处于睡眠状态或已锁定也可以正常工作,也可以不工作。

此外,如果您要同时安排10件事情,除非您给出不同的意图操作,否则AlarmManager将使用新事件替换现有的预定待处理意图。当我使用Alarms时,我总是使用sqlite数据库来排队我想要按照某些计划执行的作业。从那里我会一次安排一个警报,因为当蜂鸣器响起时它们都执行了相同的意图。

如果您安排了重复发生的警报,并且在用户设备处于睡眠状态时多次关闭,EXTRA_ALARM_COUNT额外功能将会发挥作用。当手机唤醒时,它将重播过去排队的任何内容。在这种情况下,您的待处理意图将触发并具有跳过警报的次数的值,因为它是在调用set方法时使用RTC或ELAPSED_REALTIME作为类型构造的。

以下是我通常与AlarmManger交互的示例

protected void scheduleNext(Context context) {
    AlarmManager alarmManager = getAlarmManager();
    Intent intent = new Intent(MyIntent.ACTION_DO_WORK);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 

    String where = Queue.SCHEDULED_DATE + "= (select min(" + Queue.SCHEDULED_DATE + ") from queue where " + Queue.COMPLETED_DATE + " is null)";
    Cursor cursor = context.getContentResolver().query(Queue.CONTENT_URI, Queue.PROJECTION, where, null, null);

    if (cursor.moveToFirst()) {
        int id = cursor.getInt(cursor.getColumnIndex(Queue._ID));
        long when = cursor.getLong(cursor.getColumnIndex(Queue.SCHEDULED_DATE));
        alarmManager.set(AlarmManager.RTC_WAKEUP, when, pendingIntent);
    }   

    cursor.close();
}