Obtenir le contexte dans un service


280

Existe-t-il un moyen fiable d'obtenir un Contextd'un Service?

Je souhaite enregistrer un récepteur de diffusion pour ACTION_PHONE_STATE_CHANGEDmais je n'ai pas besoin que mon application obtienne toujours ces informations, donc je ne les mets pas dans le Manifest.

Cependant, je ne peux pas faire tuer le récepteur de diffusion par le GC lorsque j'ai besoin de ces informations, donc j'enregistre le récepteur de diffusion dans un fichier Service.

Par conséquent, j'ai besoin d'un Contextappel registerReceiver(). Quand je n'ai plus besoin de ACTION_PHONE_STATE_CHANGEDje le désinscris .

Des conseils?

Réponses:


781

3
J'ai eu ce problème, mais il s'est avéré que c'était le thread de travail qui n'avait pas de contexte. Je l'ai résolu en passant un contexte lors de la construction du fil.
ctrl-alt-delor

17
Remarque: Le contexte au sein du service ne sera pas visible avant onStart ou onStartCommand dans les services: stackoverflow.com/questions/7619917/…
classe

36
C'est peut-être la réponse la plus courte avec les votes les plus élevés dans stackoverflow
Sayka

4
compte tenu de la taille de la réponse et des votes positifs reçus, je ne pense pas qu'une autre réponse dans SO bat ceci :)
Amruta-Pani

2
ces 4 mots viennent de résoudre mon problème que j'essaie de résoudre depuis 3 heures.
Nirup Iyer

64

Services'étend ContextWrapperqui s'étend Context. Par conséquent, Servicec'est un Context. Utilisez un 'this'mot-clé dans le service.


31
  1. Service étend ContextWrapper
  2. ContextWrapper étend Context

Alors....

Context context = this;

(en classe de service ou d'activité)


8

Puisque Serviceest un Context, le contexte variable doit être this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Comme le service est déjà un contexte lui-même

vous pouvez même le faire passer:

Context mContext = this;

OU

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

1

juste au cas où quelqu'un obtiendrait NullPointerException, vous devez obtenir le contexte à l'intérieuronCreate().

Serviceest un Context, alors faites ceci:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.