启动服务时AlarmManager的唤醒锁定

Tim*_*Tim 8 android alarmmanager android-wake-lock

Android的AlarmManager Javadoc说明

When an alarm goes off, the Intent that had been registered for it is broadcast by the system,

AlarmServiceAndroid提供的API演示中有一个(包com.example.android.apis.app),它演示了正在使用的AlarmService.

在其中我们有以下内容(为清晰起见编辑):

PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this,
            0, new Intent(AlarmService.this, AlarmService_Service.class), 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000, mAlarmSender);
Run Code Online (Sandbox Code Playgroud)

因此,在这个例子中,它不会执行,PendingIntent mAlarmSender = PendingIntent.getBroadcast(...);而是执行getServiceJavadoc从未提及的内容.

我问这个的原因是因为CPU唤醒锁的影响.Javadoc表示,一旦广播接收器onReceive()返回,AlarmManger的唤醒锁将被释放.

我想知道的是,如果您使用示例中的警报,唤醒锁定的含义是什么?Javadoc似乎没有解决这个问题.如果有什么似乎暗示你必须在设置警报时使用广播技术.

Com*_*are 6

我想知道的是,如果您使用示例中的警报,唤醒锁定的含义是什么?

无法保证您的服务在设备进入睡眠状态之前就能获得控制权.

如果有什么似乎暗示你必须在设置警报时使用广播技术.

对于_WAKEUP警报,是的,因为这是我们保证在设备仍处于唤醒状态时获得控制的唯一途径.

由于_WAKEUP警报要完成的工作通常超出了您可以安全地进行onReceive()清单注册的范围BroadcastReceiver,因此常见的模式是将工作委托给IntentService.为此,我已打包WakefulIntentService,实现模式,以便安全地将控制权传递给IntentService并保持设备唤醒足够长的时间,以便服务完成其工作.

  • @Tim:"要取消(),您需要启动它的PendingIntent,我无权访问." - 不,你需要一个等效的`PendingIntent`,意思是使用等效的`Intent`创建的`PendingIntent`,其中"equivalent"意味着"相同的组件,动作,`Uri`,类别和MIME类型".Re:小遗漏,是的,如果你使用新的`AlarmReceiver`,我忘了提到这个要求.它还指出了一些在自述文件中没有正确转换降价的地方.谢谢! (2认同)