BroadcastReceiver的VS WakefulBroadcastReceiverBroadcastReceiver、VS、WakefulBroadcastReceiver

2023-09-05 06:25:03 作者:寸步不離、

有人可以解释我在breify,是什么的BroadcastReceiver和WakefulBroadcastReceiver之间准确的区别。

can Somebody explain me in breify, what is the exact difference between BroadcastReceiver and WakefulBroadcastReceiver.

在这情况下,我们一定要到这个接收器。

In which situation we have to go to this receivers.

推荐答案

之间存在的BroadcastReceiver WakefulBroadcastReceiver 。

当您收到内部的onReceive广播()方法

假设,

的BroadcastReceiver

是不保证是 CPU会保持清醒如果您启动一些长时间运行的进程。 CPU可立即回到入睡。 It is not guaranteed that CPU will stay awake if you initiate some long running process. CPU may go immediately back to sleep.

WakefulBroadcastReceiver

是保障是 CPU会保持清醒,直到你火 completeWakefulIntent 。 It is guaranteed that CPU will stay awake until you fire completeWakefulIntent.

例如:

在这里,当你接收广播,你开始一个服务,因为你正在使用 WakefulBroadcastReceiver ,将持有 wakelock ,不会让CPU睡眠直到完成内部供水和消防工作的 completeWakefulIntent

Here, when you receive broadcast, you are starting a service, as you are using WakefulBroadcastReceiver, it will hold wakelock and won't let the CPU sleep until you finish the work inside service and fire completeWakefulIntent

code:

    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);
    }
}

    public 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);
    }
}