BroadcastReceiver与WakefulBroadcastReceiver

有人能解释一下BroadcastReceiverWakefulBroadcastReceiver之间的确切区别吗

在什么情况下,我们必须使用每个接收器类

BroadcastReceiverWakefulBroadcastReceiver之间只有一个区别

当您在onReceive()方法中接收广播时

假设

广播接收器

  • 如果启动一些长时间运行的进程,不保证CPU将保持清醒。CPU可能会立即恢复睡眠

WakefulBroadcastReceiver

  • 保证CPU将保持清醒,直到您触发完成WakeFulIntent

例如:

在这里,当您接收广播时,您正在启动一项服务,因为您正在使用WakefulBroadcastReceiver,它将保持wakelock,直到您完成服务内部的工作并触发completeWakefulIntent

代码:

公共类SimpleWakefulReceiver扩展WakefulBroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
//这是为我们提供服务的目的。
意向服务=新意向(上下文,SimpleWakefulService.class);
//启动服务,在设备启动时保持设备处于唤醒状态。
Log.i(“SimpleWakefulReceiver”,“启动服务@”+SystemClock.elapsedRealtime());
startWakefulService(上下文、服务);
}
}
类SimpleWakefulService扩展了IntentService{
公共SimpleWakefulService(){
超级(“SimpleWakefulService”);
}
@凌驾
受保护的手部内容无效(意图){
//此时SimpleWakefulReceiver仍保持着唤醒锁
//为了我们,我们可以在这里做我们需要做的一切,然后告诉它
//它可以释放wakelock。这个示例只是做了一些缓慢的工作,
//但是,更复杂的实现可能需要自己的时间
//在这里释放接收器之前。
//
//请注意,在使用此方法时,您应该注意
//服务在这样的工作中被杀死并重新启动。
//(因此重新传达再次执行工作的意图),它将
//在这一点上,我们将不再持有唤醒锁,因为我们正在依赖
//简单地说,这对我们来说很重要。如果这是一个问题,你可以
//在这里获得一个单独的尾流锁。
对于(int i=0;i<5;i++){
Log.i(“SimpleWakefulReceiver”,“正在运行的服务”+(i+1)
+“/[email protected]”+SystemClock.elapsedRealtime());
试一试{
睡眠(5000);
}捕捉(中断异常e){
}
}
Log.i(“SimpleWakefulReceiver”,“Completed [email protected]”+SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
}

发表评论