Obtener contexto en un servicio


280

¿Hay alguna forma confiable de obtener un Contexta Service?

Quiero registrar un receptor de transmisión, ACTION_PHONE_STATE_CHANGEDpero no necesito que mi aplicación siempre obtenga esta información, así que no la pongo en el Manifest.

Sin embargo, no puedo hacer que el GC elimine el receptor de transmisión cuando necesito esta información, así que estoy registrando el receptor de transmisión en a Service.

Por lo tanto, necesito un Contextpara llamar registerReceiver(). Cuando ya no lo necesito, ACTION_PHONE_STATE_CHANGEDlo anulo .

¿Algun consejo?

Respuestas:


781

3
Tuve este problema, pero resultó que era el hilo de trabajo que no tenía contexto. Lo resolví pasando un contexto al construir el hilo.
ctrl-alt-delor

17
Nota: El contexto dentro del servicio no será visible hasta que onStart o onStartCommand en servicios: stackoverflow.com/questions/7619917/…
clase

36
Esta puede ser la respuesta más corta con los votos más altos en stackoverflow
Sayka

44
considerando el tamaño de la respuesta y los votos recibidos, no creo que ninguna otra respuesta en SO
supere

2
Estas 4 palabras simplemente resolvieron mi problema que he estado tratando de resolver durante 3 horas.
Nirup Iyer

64

Servicese extiende lo ContextWrapperque se extiende Context. Por lo tanto, el Servicees a Context. Use 'this'palabras clave en el servicio.


31
  1. Service se extiende ContextWrapper
  2. ContextWrapper se extiende Context

Entonces....

Context context = this;

(en clase de servicio o actividad)


8

Como Servicees a Context, el contexto variable debe ser this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Como el servicio ya es un contexto en sí mismo

incluso puedes hacerlo:

Context mContext = this;

O

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

1

solo en caso de que alguien esté recibiendo NullPointerException, necesita obtener el contexto dentroonCreate().

Servicees un Context, así que haz esto:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.