如何使用android报警管理器设置多个报警

Has*_*y31 52 android alarmmanager

我正在建立一个报警应用程序.我已经成功实现了基本的报警功能.

Calendar calendar = Calendar.getInstance();
calendar.set(calendar.HOUR_OF_DAY, sHour);
calendar.set(calendar.MINUTE, sMin);
calendar.set(calendar.SECOND, 0);
calendar.set(calendar.MILLISECOND, 0);
long sdl = calendar.getTimeInMillis();

Intent intent = new Intent(AlarmList.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(AlarmList.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager ALARM1 = (AlarmManager)getSystemService(ALARM_SERVICE);
ALARM1.set(AlarmManager.RTC_WAKEUP, sdl, sender);
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,用户可以选择天(星期日,星期一......)每周重复闹钟.我正在尝试创建多个警报,每周重复一次,但不知道该怎么做.我可以使用(重复)间隔创建它还是应该创建多个警报管理器?

Par*_*han 147

您需要使用different Broadcast id'spending intents.像这样的东西:

    Intent intent = new Intent(load.this, AlarmReceiver.class);
    final int _id = (int) System.currentTimeMillis();
    PendingIntent appIntent = PendingIntent.getBroadcast(this, _id, intent,PendingIntent.FLAG_ONE_SHOT);
Run Code Online (Sandbox Code Playgroud)

使用系统时间应该是您触发的每个待处理目标的唯一标识符.

  • 我们怎么能最终取消所有这些呢?我们需要保留_id的引用? (3认同)
  • @Parag Chauhan:谷歌没有实现简单的cancelAll()调用,这是正确的.就像在Nearby Messages中一样,没有canceAll()所以我们必须实现大量的代码来实现简单的事情.而且我们的经理也不会高兴,因为没有人会这样做. (3认同)

Ree*_*eed 10

来自文档:

如果已安排此Intent的警报(两个意图的相等性由filterEquals(Intent)定义),则它将被删除并替换为此

多个AlarmManagers不能解决您的问题.如果它们有多个不同的警报(不同的时间和不同的日期),那么您需要在BroadcastReceiver每次触发上一个警报时设置警报.

您还需要按住RECEIVE_BOOT_COMPLETEDBroadcastReceiver接收启动,以便在重新启动电话时可以重新安排警报.


Adi*_*ain 6

要设置多个警报,您需要定义Intent每次警报,以便与其他警报区分开来.我发现这样做最简单的方法是设置data你的Intent东西字段如下:

// give your alarm an id and save it somewhere
// in case you want to cancel it in future
String myAlarmId = ...;

// create your Intent
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class);
intent.setData(Uri.parse("myalarms://" + myAlarmId));
...
Run Code Online (Sandbox Code Playgroud)

你的其余代码@ Hassy31原样很好并保持不变.

请注意,根据文档requestCode,PendingIntent.getBroadcast()方法中的参数(由@parag建议)未使用,因此这不是正确的方法.