| java.lang.Object | ||
| ↳ | android.content.BroadcastReceiver | |
| ↳ | android.support.v4.content.WakefulBroadcastReceiver | |
       Helper for the common pattern of implementing a
       
        
         BroadcastReceiver
        
       
       that receives a device wakeup event and then passes the work off
 to a
       
        
         Service
        
       
       , while ensuring that the
 device does not go back to sleep during the transition.
      
       This class takes care of creating and managing a partial wake lock
 for you; you must request the
       
        
         WAKE_LOCK
        
       
       permission to use it.
      
       A
       
        
         WakefulBroadcastReceiver
        
       
       uses the method
       
        
         startWakefulService()
        
       
       to start the service that does the work. This method is comparable to
       
        
         startService()
        
       
       , except that
 the
       
        
         WakefulBroadcastReceiver
        
       
       is holding a wake lock when the service
 starts. The intent that is passed with
       
        
         startWakefulService()
        
       
       holds an extra identifying the wake lock.
      
       import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.util.Log;
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);
    }
}
      
      
       The service (in this example, an
       
        
         IntentService
        
       
       ) does
 some work. When it is finished, it releases the wake lock by calling
       
        
         completeWakefulIntent(intent)
        
       
       . The intent it passes as a parameter
 is the same intent that the
       
        
         WakefulBroadcastReceiver
        
       
       originally
 passed in.
      
       import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
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);
    }
}
      
     | Public Constructors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 
          | 
        
          | 
       ||||||||||
| Public Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 
          | 
        
          
          Finish the execution from a previous
           
        
           
            startWakefulService(Context, Intent)
           
          
          .
          | 
       ||||||||||
| 
          | 
        
          
          Do a
           
        
           
            Context.startService
           
          
          , but holding a wake lock while the service starts.
          | 
       ||||||||||
| 
         
          [Expand]
         
          
          Inherited Methods
          
         | 
       |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
         
           
         
         From class
         
          android.content.BroadcastReceiver
         
          | 
       |||||||||||
         
           
         
         From class
         
          java.lang.Object
         
          | 
       |||||||||||
         Finish the execution from a previous
         
          
           startWakefulService(Context, Intent)
          
         
         .  Any wake lock
 that was being held will now be released.
        
| intent | 
           The Intent as originally generated by
           
            
             startWakefulService(Context, Intent)
            
           
           .
           | 
         
|---|
         Do a
         
          
           Context.startService
          
         
         , but holding a wake lock while the service starts.
 This will modify the Intent to hold an extra identifying the wake lock;
 when the service receives it in
         
          
           Service.onStartCommand
          
         
         , it should pass back the Intent it receives there to
         
          
           completeWakefulIntent(android.content.Intent)
          
         
         in order to release
 the wake lock.
        
| context | The Context in which it operate. | 
|---|---|
| intent | 
           The Intent with which to start the service, as per
           
            
             Context.startService
            
           
           .
           |