当闹钟响起时,系统会广播已注册的Intent,
Android提供的API演示中有一个AlarmService(包com.example.android.apis.app),它演示了正在使用的AlarmService.
在其中我们有以下内容(为清晰起见编辑):
PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this,new Intent(AlarmService.this,AlarmService_Service.class),0); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstTime,30*1000,mAlarmSender);
所以在这个例子中它没有PendingIntent mAlarmSender = PendingIntent.getBroadcast(…);相反,它会执行Javadoc永远不会提到的getService.
我问这个的原因是因为cpu唤醒锁的影响. Javadoc表示,一旦广播接收器的onReceive()返回,AlarmManger的唤醒锁将被释放.
我想知道如果您使用示例中的警报,唤醒锁定的含义是什么? Javadoc似乎没有解决这个问题.如果有什么似乎暗示您在设置警报时必须使用广播技术.
解决方法
What I am wondering is what are the wake lock implications if you use an Alarm like in the example?
无法保证您的服务在设备入睡前能够获得控制权.
If anything it seems to imply that you must use the broadcast technique when setting alarms.
对于_WAKEUP警报,是的,因为这是我们保证在设备仍处于唤醒状态时获得控制权的唯一途径.
由于_WAKEUP警报要完成的工作通常超出了在清单注册的BroadcastReceiver的onReceive()中可以安全地执行的工作,因此常见的模式是将工作委托给IntentService.为此,我打包了WakefulIntentService
,以实现模式,以便将控制安全地传递给IntentService,并使设备保持足够长的时间以使服务完成其工作.