java - 如何满足警报管理器中的预定时间列表以推送通知

标签 java android sqlite alarmmanager android-notifications

我正在尝试将存储在 Sqlite 中的时间列表(它有小时和分钟)检索到警报管理器中,以通过通知执行提醒。我的方法是将所有存储在Sqlite中的预定时间循环到报警管理器中,根据存储的时间列表执行通知,但通知不会发出哔哔声。

但是当我指定一个时间(小时和分钟)时它起作用了。下面是有效的代码示例,但我不想要这个:

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 45);
Intent myIntent = new Intent(ListRemainder.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(ListRemainder.this, 0, myIntent, 0);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

但是当涉及到循环几个时间表时它不起作用,这是我想要的方法,下面是代码示例,我错过了什么?

//listOfTime is the one which contains the list of stored scheduled time in Sqlite.
for (int i = 0; i < listOfTime.size(); i++) {
    int hour = Integer.parseInt(listOfTime.get(i).toString().substring(0, 2));
    int minute = Integer.parseInt(listOfTime.get(i).toString().substring(3));
    System.out.print("Hour : " + hour + " Minute : " + minute);
    Log.d("MyActivity", "Alarm On");
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    Intent myIntent = new Intent(ListRemainder.this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(ListRemainder.this, 0, myIntent, 0);
    alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}

最佳答案

getBroadcast 的原型(prototype)如下:

getBroadcast(Context context, int requestCode, Intent intent, int flags)

为每个 PendingIntent 设置唯一的“requestCode”应该允许安排多个警报:

PendingIntent.getBroadcast(context, uniqueValue, intent, PendingIntent.FLAG_UPDATE_CURRENT);

为了保证用户关键警报的唤醒:

void setAlarmClock (AlarmManager.AlarmClockInfo info, 
            PendingIntent operation)

来自文档: “安排一个代表闹钟的闹钟,当它响起时将用于通知用户。期望是当这个闹钟触发时,应用程序将进一步唤醒设备以告诉用户闹钟 - 转动在屏幕上播放声音、振动等。因此,如果合适,系统通常还会使用此处提供的信息来告知用户即将到来的警报。

由于这种警报的性质,类似于 setExactAndAllowWhileIdle(int, long, PendingIntent),即使系统处于低功耗空闲(也称为打瞌睡)模式,这些警报也将被允许触发。"

总结一下:

  • 使用 setAlarmClock 唤醒设备以向用户呈现信息。
  • 使用 setExactAndAllowWhileIdle 在后台执行必须在 hibernate 期间完成的工作。但是,这些警报的触发可能会有大约 1 分钟到 15 分钟的延迟。
  • 使用 FCM 从远程应用程序实时唤醒设备。在实践中,如果可能,许多应用应该使用 FCM 而不是 setExactAndAllowWhileIdle。
  • 如果在打瞌睡期间精确同步并不重要,请使用 setExact。此外,在 API 21 之前的设备上使用 setExact 而不是 setAlarmClock 或 setExactAndAllowWhileIdle...

Lutaaya的最终解决方案:

AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(),pendingIntent), pendingIntent);

关于java - 如何满足警报管理器中的预定时间列表以推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248121/

相关文章:

android - 如何使用avdmanager从命令行正确创建Android模拟器?

objective-c - 如何将char *转换为float xcode

android - 处理 Android 中的 sqlite 'database is locked' 错误

java - 从 java 设置 Windows XP 中网络接口(interface)的 IP 地址

android - WebView重置缩放设置

Java NetBeans 编译错误

android - 如何使用 JXL 2.6.12 jar 读取 excel 文件

java - 即使数据存在,也无法从 sqlite 获取数据(大多数发生在 Android 9 设备中)

java - 如何使用 Java 的 DecimalFormat 进行 "smart"货币格式?

java collat​​z 代码在达到 1 时不会停止