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

时间:2016-07-04 10:46:27

标签: 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 alarm

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

1 个答案:

答案 0 :(得分:1)

首先,我假设您将此代码用于Lollipop及更高版本的Samsung设备。在这种情况下,我有同样的问题,经过大量的搜索和解决方法后,我认为三星设备在Lollipop及以上的智能管理器可能是问题所在。此组件可以延迟警报管理器关闭,它在3分钟后触发,如果移动设备正在使用电池并且屏幕关闭,则警报管理器工作正常,这就是为什么您看到这些方法没有有时执行。当然,您可以停用特定应用的智能管理器。

  1. 在设备上启动Samsung Smart Manager应用程序
  2. 点击电池
  3. 点按应用优化
  4. 列表项
  5. 点按应用优化明细
  6. 找到您的APP选择"已禁用"
  7. 但是在我的情况下它没有用,也没有禁用智能管理器在两个带Lollipop的三星设备上工作。有用的是傻瓜" Smart Manager通过重构我的应用程序包的名称来包含String" alert"或" alarm",例如com.example.alarm.myApplication。您还可以参考此link以获取更多信息。