据我了解,在使用警报管理器安排警报时,您必须提供 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();
}