1

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

警报意图与称为 Intent.EXTRA_ALARM_COUNT 的 int 类型的额外数据一起传递,指示有多少过去的警报事件已累积到此意图广播中。由于手机处于睡眠状态而导致未发送的重复警报在发送时的计数可能大于 1。

4

2 回答 2

3

最不为人知的一件事(主要是因为 Android 文档告诉它“目前未使用”)是,如果 requestCode 不同,则不会重用 PendingIntent。因此,请改为使用请求代码 0 创建 PI:

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

您可以实现一个计数器并执行以下操作:

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

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

希望这可以帮助。

于 2011-02-06T09:51:44.810 回答
2

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

有两种类型的警报,一种即使手机处于睡眠状态或锁定状态也会唤醒并开始工作,另一种则不会。

此外,如果您要一次安排 10 件事情,AlarmManager 将用新的一项替换现有的 Scheduled Pending 意向,除非您给它不同的意向操作。当我使用警报时,我总是使用 sqlite 数据库来排队我想按某个计划执行的作业。从那里我会一次安排一个警报,因为当蜂鸣器响起时,它们都执行相同的 Intent。

如果您安排了重复发生的警报并且当用户设备处于睡眠状态时它会多次响起,则 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();
}
于 2010-12-12T00:26:50.993 回答