AlarmManager在睡眠模式下无法正常工作

6
我设置了一个带有重复时间的AlarmManager。这是我设置它的方法:
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 才会重新开始工作。

如何让 AlarmManager 在睡眠模式下继续运行?


AlarmManager.set(AlarmManager.RTC_WAKEUP, ...) 对我来说完全正常,我还没有尝试过 AlarmManager.setRepeating()。也许这有关系?不知道,只是想提一下。 - SteelBytes
setRepeating会在一定时间后重复执行任务,其余事项不变。 - Reyjohn
有人能给我一个解决方案吗? - Reyjohn
你解决了这个问题吗,@Reyjohn?我也遇到了类似的问题。 - Santiago
1个回答

8
这是因为你的PendingIntent调用了一个服务,而不是一个BroadcastReceiver,这意味着设备甚至在创建服务之前就可能会进入睡眠状态。如果你转移到广播接收器,它“应该”保持唤醒状态,直到BroadcastReceiver的onReceive完成,这意味着你将有时间获取wakelock并启动服务。即使你转移到BroadcastReceiver,如果处理需要超过10秒(这是BroadcastReceiver的限制),你也需要获取wakelock直到处理完成。
这是从AlarmManager的android文档第二段中提取的:
“……如果你的闹钟接收器调用了Context.startService(),则可能会在启动请求的服务之前手机进入睡眠状态。为了防止这种情况发生,你的BroadcastReceiver和Service将需要实现单独的wakelock策略,以确保手机继续运行,直到服务可用。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接