我已经设置了一个具有重复时间的警报管理器。以下是我的设置方法:

public void setAlarmManager(Context context, Intent intent) {
    PendingIntent pendingIntent;
    pendingIntent  = PendingIntent.getService(context, 0, intent, 0);
    AlarmManager alarmManager =
        (AlarmManager)context.getSystemService(context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 10);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                              calendar.getTimeInMillis(),
                              40000, pendingIntent);
}

这可以正常工作,除非当我的设备进入睡眠模式,警报停止工作,直到我手动唤醒我的设备。唤醒设备后,AlarmManager重新开始工作。
如何让经理在睡眠模式下运行?

最佳答案

这是因为您的PendingIntent调用的是服务,而不是BroadcastReceiver,这意味着设备可以在创建服务之前恢复睡眠。如果您移动到广播接收器,它“应该”保持清醒,直到onreceive完成广播接收器,这意味着您将有时间获得wakelock并启动您的服务。即使您移动到BroadcastReceiver中,如果需要超过10秒(这是BroadcastReceiver的限制),您也需要获取wakelock,直到完成处理为止。
这摘自AlarmManager的Android文档第2段:
“……”如果您的报警接收器呼叫了Context.startService(),则手机可能会在启动所请求的服务之前休眠。为了防止出现这种情况,您的广播接收器和服务需要实施单独的唤醒锁定策略,以确保手机继续运行,直到服务可用为止。”

07-26 08:31