web-dev-qa-db-fra.com

BroadcastReceiver Vs WakefulBroadcastReceiver

Quelqu'un peut-il expliquer quelle est la différence exacte entre BroadcastReceiver et WakefulBroadcastReceiver ?

Dans quelles situations devrions-nous utiliser chaque classe de récepteurs?

61
user2107111

Il n'y a qu'une seule différence entre BroadcastReceiver et WakefulBroadcastReceiver.

Lorsque vous recevez la diffusion dans la méthode onReceive(),

Supposer,

BroadcastReceiver:

  • Il est non garanti que la CPU restera éveillée si vous lancez un processus long. Le processeur peut s'endormir immédiatement.

WakefulBroadcastReceiver:

  • Il est garanti que la CPU reste éveillée jusqu'à ce que vous tiriez completeWakefulIntent.

Exemple:

Ici, lorsque vous recevez une diffusion, vous démarrez un service, car vous utilisez WakefulBroadcastReceiver, il tiendra wakelock et ne laissera pas la CPU dormir tant que vous n’aurez pas terminé le travail dans le service et le feu. 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);
    }
}

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);
    }
}
105
Mehul Joisar