我有一个关于在AlarmManager中设置警报的问题。我在文档中找到了一些我不理解的东西(见下文)。我想设置10个警报,触发振铃模式交替静音和正常,所有触发时间都不同。现在设备处于睡眠状态,并在所有10个警报都过时后再次激活。然后AlarmManager会立即广播警报吗?它只是第10个(关于铃声模式怎么样)?
报警意图随附一份 int类型的数据额外调用 Intent.EXTRA_ALARM_COUNT表示 表示过去的警报事件数 已经累积到这个意图中 广播。有重复的警报 由于手机没电,所以没有送达 睡着的人数可能大于 交付时一个。
答案 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();
}