2015-02-26 14 views
31

Ecco lo scenario: Ho un WakefulBroadcastReceiver che esegue un backup in un computer di rete o nel cloud. È impostato per andare nel mezzo della notte , quando so che il tablet avrà accesso alla LAN . Il backup memorizzerà i dati in una posizione e un file che è stato "prelevato" dal frammento che ha istanziato WakefulBroadcastReceiver, utilizzando Storage Access Framework. Quindi devo essere in grado di accedere al ContentResolver e per farlo ho bisogno del contesto.Come ottenere il contesto in un servizio Intent

Da tutta la mia lettura dei documenti, questo è ciò che il BroadcastReceiver è destinato ad essere utilizzato per - un compito potenzialmente lunga corsa che dovrebbe essere fatto in background quando non molto altro è accadendo. - Come un backup. Non ho visto nessun esempio che mette insieme .

Come si ottiene il contesto in IntentService? Qui è uno snippet del destinatario e del servizio di pianificazione.

public class BackupAlarmReceiver extends WakefulBroadcastReceiver { 

    @Override 
     public void onReceive(Context context, Intent intent) { 

      Intent service = new Intent(context, BackupSchedulingService.class); 

     startWakefulService(context, service); 

     } 
} 

public class BackupSchedulingService extends IntentService { 
    public BackupSchedulingService() { 
     super("BackupSchedulingService"); 
    } 

@Override 
    protected void onHandleIntent(Intent intent) { 

     Bundle extras = intent.getExtras(); 
     // How to get the context - it was a parameter when 
     // creating the new IntentService class above? 
     } 
} 

Il codice di esempio praticamente segue esattamente il riferimento manuale del codice Android qui:

https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

risposta

61

Quindi la mia domanda è: come faccio ad avere il contesto in un IntentService?

Il IntentServiceè la Context, come IntentService eredita da Context.

26

Basta chiamare getApplicationContext()

+0

Qual è la differenza tra "getApplicationContext()" e "this"? – Zapnologica

+5

funziona in "protected void onHandleIntent (Intent intent) {" ma non nel costruttore IntentService –

+0

@Moises puoi spiegare perché? – SLearner

2

Usa BackupSchedulingService.this (ServiceName.this) per ottenere Context

Motivo: Servizio estende ContextWrapper
ContextWrapper estende Contesto

5

È possibile ottenere il contesto nella funzione onStartCommand().

public class ExampleService extends IntentService { 
    private Context mContext; 

    public ExampleService(String name) { 
    super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    mContext = getApplicationContext(); 
    return super.onStartCommand(intent, flags, startId); 
    } 
    }