Ottieni contesto in un servizio


280

C'è un modo affidabile per ottenere un Contextda un Service?

Voglio registrare un ricevitore broadcast per ACTION_PHONE_STATE_CHANGEDma non ho bisogno della mia app per ottenere sempre queste informazioni, quindi non le inserisco in Manifest.

Tuttavia, non posso fare in modo che il ricevitore di trasmissione venga ucciso dal GC quando ho bisogno di queste informazioni, quindi sto registrando il ricevitore di trasmissione in a Service.

Quindi, ho bisogno di un Contextda chiamare registerReceiver(). Quando ho bisogno di più l' ACTION_PHONE_STATE_CHANGEDho annullare la registrazione di esso.

Qualche consiglio?

Risposte:


781

3
Ho avuto questo problema, ma si è scoperto che era il thread di lavoro che non aveva contesto. Ho risolto il mio passaggio di un contesto durante la costruzione del thread.
ctrl-alt-delor

17
Nota: Il contesto all'interno del servizio non sarà visibile fino onStart o onStartCommand nei servizi: stackoverflow.com/questions/7619917/...
classe

36
Questa potrebbe essere la risposta più breve con il punteggio più alto in StackOverflow
Sayka,

4
considerando la dimensione della risposta e dei voti ricevuti, non credo che nessun'altra risposta in SO batte questo :)
Amruta-Pani,

2
queste 4 parole hanno appena risolto il mio problema che ho cercato di risolvere per 3 ore.
Nirup Iyer,

64

Servicesi estende ContextWrapperche si estende Context. Quindi il Serviceè un Context. Usa la 'this'parola chiave nel servizio.


31
  1. Service si estende ContextWrapper
  2. ContextWrapper si estende Context

Così....

Context context = this;

(in classe di servizio o attività)


8

Poiché Serviceè un Context, il contesto variabile deve essere this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Poiché il servizio è già un contesto stesso

puoi persino farcela:

Context mContext = this;

O

Context mContext = [class name].this;  //[] only specify the class name
// mContext = JobServiceSchedule.this; 

1

nel caso in cui qualcuno stia ottenendo NullPointerException, è necessario inserire il contesto all'internoonCreate().

Serviceè un Context, quindi fai questo:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.