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?

user123321
la source

Réponses:

781

Le service est un contexte

mibollma
la source
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.

user2138983
la source
31
  1. Service étend ContextWrapper
  2. ContextWrapper étend Context

Alors....

Context context = this;

(en classe de service ou d'activité)

Hardik Gajera
la source
8

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

DataBaseManager dbm = Utils.getDataManager(this);   
Jorgesys
la source
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; 
Ali Azaz Alam
la source
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;
}
Ecclesiaste Panda
la source