我正在尝试使用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 。
因此,如果有人可以告诉我如何安排警报,使其每次都被触发,无论调用该方法的频率如何,或者甚至引导我朝着正确的方向前进,都会有很大的帮助。 :)
答案 0 :(得分:1)
首先,我假设您将此代码用于Lollipop及更高版本的Samsung设备。在这种情况下,我有同样的问题,经过大量的搜索和解决方法后,我认为三星设备在Lollipop及以上的智能管理器可能是问题所在。此组件可以延迟警报管理器关闭,它在3分钟后触发,如果移动设备正在使用电池并且屏幕关闭,则警报管理器工作正常,这就是为什么您看到这些方法没有有时执行。当然,您可以停用特定应用的智能管理器。
但是在我的情况下它没有用,也没有禁用智能管理器在两个带Lollipop的三星设备上工作。有用的是傻瓜" Smart Manager通过重构我的应用程序包的名称来包含String" alert"或" alarm",例如com.example.alarm.myApplication。您还可以参考此link以获取更多信息。