android - 已跳过 setExact 方法调用。警报未按预期触发

标签 android notifications alarmmanager

我正在尝试使用 AlarmManager 为通知设置警报。警报是在用户选择列表项时设置的,因此我每次都尝试设置一个单独的警报(将唯一 ID 传递到 pendingIntent)选择一个列表项。

用于设置闹钟的代码:

public static void setAlarm(Context context, Movie movie, Schedule schedule){
    Intent arg = new Intent(context, NotifyService.class);
    arg.putExtra(NotificationHelper.fetch_schedule_id, schedule.getId());
    arg.putExtra(NotificationHelper.fetch_movie_id, movie.getId());
    PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), (int) schedule.getId(), arg, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        am.setExact(AlarmManager.RTC_WAKEUP, schedule.getStart().getTime(), pendingIntent);
    else
        am.set(AlarmManager.RTC_WAKEUP, schedule.getStart().getTime(), pendingIntent);
}

我正在处理的问题是对set(或setExact)方法的调用有时没有被执行。它确实有一半的时间有效,但在特定情况下,例如,当用户点击两个或多个列表项时,在不到一秒的时间内一个接一个地点击,然后只执行第一个调用,其余的调用将被忽略。

此外,由于 set/setexact 方法返回 void 如果调用了该方法并设置了警报,我无法进行调试。现在我必须每次都检查 adb shell dumpsys 警报

因此,如果有人可以告诉我如何安排一个警报,使其每次都被触发,无论调用该方法的频率如何,甚至可以指导我朝着正确的方向前进,这将是一个很大的帮助。 :)

最佳答案

首先,我假设您将此代码用于 Lollipop 及以上版本的三星设备。在这种情况下,我遇到了同样的问题,经过大量搜索和解决方法后,我认为 Lollipop 及更高版本中的 Samsung Devices Smart Manager 可能是问题所在。该组件可以延迟警报管理器关闭,它会在 3 分钟后触发,如果手机使用电池供电并且屏幕关闭,否则警报管理器运行良好,这就是为什么您会看到这些方法有时不执行的原因。当然,您可以为特定应用停用智能管理器。

  1. 在设备上启动 Samsung Smart Manager 应用
  2. 点击电池
  3. 点按应用优化
  4. 列表项
  5. 点按应用优化详细信息
  6. 找到您的应用选择“已禁用”

但在我的情况下它不起作用,禁用智能管理器在 2 台带有 Lollipop 的三星设备上都不起作用。有效的方法是通过重构我的应用程序包的名称以包含字符串“alert”或“alarm”来“愚弄”Smart Manager,例如 com.example.alarm.myApplication。也可以引用这个link了解更多信息。

关于android - 已跳过 setExact 方法调用。警报未按预期触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38182817/

相关文章:

android - 如何在 flutter 中创建自定义步进器?

android - Action Bar 的 Home 按钮的 onClick 监听器

java - Java中的通知系统

android - Stacked Wear 通知也显示在手机上

Android AlarmManager 在 Activity 终止时停止

android - AlarmManager 不播放选定的音调

java - 如何在Android api 11+的Android ListView 中显示联系人

android - 单击通知后启动器 Activity 将打开(应用程序已关闭)

android - 更改按钮时如何避免闪烁通知更新

android - PendingIntent 上的 "requestCode"用于什么?