AlarmManager无法在睡眠模式下工作

时间:2012-04-18 08:54:30

标签: android alarmmanager android-alarms

我设置了一个重复时间的AlarmManagr。这是我设置它的方法:

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再次开始工作。

如何让管理员即使在睡眠模式下也能运行?

1 个答案:

答案 0 :(得分:6)

这是因为您的PendingIntent正在呼叫服务而不是BroadcastReceiver,这意味着设备可以在您创建服务之前重新进入休眠状态。如果您转移到广播接收器,它“应该”保持清醒,直到onReceive完成BroadcastReceiver,这意味着您将有时间获取唤醒锁并开始服务。即使你移动到BroadcastReceiver,你也会想要获得一个唤醒锁,直到你完成处理,如果它需要超过10秒(这是BroadcastReceiver的限制)。

这取自AlarmManager的android文档的第2段:

“...如果你的闹钟接收器叫Context.startService(),手机可能会在启动所请求的服务之前休眠。为了防止这种情况,你的BroadcastReceiver和服务需要实现一个单独的唤醒锁定策略确保手机继续运行,直到服务可用。“