Android AlarmManager如何传递过去的报警?

Android AlarmManager如何传递过去的报警?,android,alarmmanager,alarm,Android,Alarmmanager,Alarm,我有一个关于在AlarmManager中设置警报的问题。我在文档中发现了一些我不理解的东西(见下文)。我想设置10个触发铃声模式的警报,交替静音和正常,所有警报的触发时间都不同。现在,设备进入休眠状态,并在所有10个警报都过期后再次激活。AlarmManager是否立即广播警报?会不会只是第十次(振铃模式呢) 报警意图通过一个 调用int类型的额外数据 意图。额外的警报 指示过去的报警事件数 已经累积到这个意图中 广播。重复出现的警报 因为电话坏了,所以无法送达 “睡眠”的计数可能大于 交货时一

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

报警意图通过一个 调用int类型的额外数据 意图。额外的警报 指示过去的报警事件数 已经累积到这个意图中 广播。重复出现的警报 因为电话坏了,所以无法送达 “睡眠”的计数可能大于 交货时一个


据我所知,在使用报警管理器安排报警时,必须提供PendingEvent实例

有两种类型的闹钟,一种是即使手机处于睡眠状态或锁定状态也能唤醒并正常工作的闹钟,另一种则不会

此外,如果您一次计划10件事情,AlarmManager将用新的计划挂起的意图替换现有的计划挂起的意图,除非您给它不同的意图操作。当我使用Alarms时,我总是使用sqlite数据库将我希望按某个时间表执行的作业排队。从那时起,我会一次安排一个警报,因为当蜂鸣器发出叮当声时,它们都执行相同的意图

如果您计划了一个再次出现的报警,并且当用户设备处于睡眠状态时,该报警多次关闭,则额外报警计数额外将起作用。当手机唤醒时,它将重播过去排队的任何内容。在这种情况下,您的挂起意图将触发,并具有跳过报警的次数值,因为在调用set方法时,该报警是以RTC或Expressed_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();
}

据我所知,在使用报警管理器安排报警时,必须提供PendingEvent实例

有两种类型的闹钟,一种是即使手机处于睡眠状态或锁定状态也能唤醒并正常工作的闹钟,另一种则不会

此外,如果您一次计划10件事情,AlarmManager将用新的计划挂起的意图替换现有的计划挂起的意图,除非您给它不同的意图操作。当我使用Alarms时,我总是使用sqlite数据库将我希望按某个时间表执行的作业排队。从那时起,我会一次安排一个警报,因为当蜂鸣器发出叮当声时,它们都执行相同的意图

如果您计划了一个再次出现的报警,并且当用户设备处于睡眠状态时,该报警多次关闭,则额外报警计数额外将起作用。当手机唤醒时,它将重播过去排队的任何内容。在这种情况下,您的挂起意图将触发,并具有跳过报警的次数值,因为在调用set方法时,该报警是以RTC或Expressed_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();
}

最未知的一件事(主要是因为Android文档告诉我们它的)是,如果请求代码不同,PendingEvent将不会被重用。因此,创建请求代码为0的PI:

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 
您可以实现计数器并执行以下操作:

    PendingIntent pendingIntent = PendingIntent.getService(context, counter, intent, 0); 
我知道,这将适用于短信发送/发送通知PendingEvents,其中您有相同的问题:如果PendingEvents被重用,并且您有超过1个未完成的通知,您将不知道它是针对哪条短信的。 但很有可能这也适用于出色的报警挂起功能


希望这能有所帮助。

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

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); 
您可以实现计数器并执行以下操作:

    PendingIntent pendingIntent = PendingIntent.getService(context, counter, intent, 0); 
我知道,这将适用于短信发送/发送通知PendingEvents,其中您有相同的问题:如果PendingEvents被重用,并且您有超过1个未完成的通知,您将不知道它是针对哪条短信的。 但很有可能这也适用于出色的报警挂起功能


希望这能有所帮助。

谢谢你的解释。我不明白的是,为什么挂起的内容会被覆盖。难道不可能安排两个在不同时间执行相同操作的挂起内容吗?还有一个问题:“……当手机唤醒时,它将重播它过去排队的任何内容。在这种情况下,您的挂起意图将触发…”-你是说只有最后一个挂起的帐篷吗?是的,如果闹钟在设备睡觉时响了,AlarmManager会在下次设备醒来时发送挂起的帐篷。我在尝试将一堆我想在不同时间触发的东西排队时也遇到了同样的挫折。这就是为什么我开始实现我的内部队列。好吧,最后一件事——你能解释一下重复报警到底是什么吗?是不是它们没有不同的意图动作?也许这可以解决这个问题……:)谢谢你的解释。我不明白的是,为什么挂起的内容会被覆盖。难道不可能安排两个在不同时间执行相同操作的挂起内容吗?还有一个问题:“……当手机唤醒时,它将重播它过去排队的任何内容。在这种情况下,您的挂起意图将触发…”-你是说只有最后一个挂起的帐篷吗?是的,如果在设备睡觉时闹钟响了,AlarmManager会在下次设备醒来时发送挂起的帐篷。我在尝试将我想要的东西排队时也遇到了同样的挫折