BroadcastReceiver vs WakefulBroadcast Receiver
2022-08-31 15:37:25
有人可以解释 BroadcastReceiver
和 WakefulBroadcastReceiver
之间的确切区别吗?
在什么情况下我们必须使用每个 Receiver 类?
有人可以解释 BroadcastReceiver
和 WakefulBroadcastReceiver
之间的确切区别吗?
在什么情况下我们必须使用每个 Receiver 类?
和 之间只有一个区别。BroadcastReceiver
WakefulBroadcastReceiver
当您收到内部方法的广播时,onReceive()
假设
广播接收者 :
WakefulBroadcast接收者 :
completeWakefulIntent
例:
在这里,当您收到广播时,您正在启动一项服务,就像您正在使用的那样,它将保持并且不会让CPU进入睡眠状态,直到您完成服务内部的工作并启动WakefulBroadcastReceiver
wakelock
completeWakefulIntent
法典:
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// This is the Intent to deliver to our service.
Intent service = new Intent(context, SimpleWakefulService.class);
// Start the service, keeping the device awake while it is launching.
Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
startWakefulService(context, service);
}
}
class SimpleWakefulService extends IntentService {
public SimpleWakefulService() {
super("SimpleWakefulService");
}
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock. This sample just does some slow work,
// but more complicated implementations could take their own wake
// lock here before releasing the receiver's.
//
// Note that when using this approach you should be aware that if your
// service gets killed and restarted while in the middle of such work
// (so the Intent gets re-delivered to perform the work again), it will
// at that point no longer be holding a wake lock since we are depending
// on SimpleWakefulReceiver to that for us. If this is a concern, you can
// acquire a separate wake lock here.
for (int i=0; i<5; i++) {
Log.i("SimpleWakefulReceiver", "Running service " + (i+1)
+ "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
}