Obter contexto em um serviço


280

Existe alguma maneira confiável de obter um Contextde um Service?

Quero registrar um receptor de transmissão, ACTION_PHONE_STATE_CHANGEDmas não preciso que meu aplicativo sempre obtenha essas informações, para não colocá-las no Manifest.

No entanto, não consigo que o receptor de transmissão seja morto pelo GC quando preciso dessas informações, por isso estou registrando o receptor de transmissão em a Service.

Por isso, preciso Contextligar registerReceiver(). Quando eu não precisar mais do ACTION_PHONE_STATE_CHANGEDque eu unregister -lo.

Alguma dica?

Respostas:


780

3
Eu tive esse problema, mas descobriu-se que era o segmento de trabalho que não tinha contexto. Eu resolvi passar um contexto ao construir o thread.
Ctrl-alt-delor

17
Nota: O contexto no serviço não estará visível até onStart ou onStartCommand nos serviços: stackoverflow.com/questions/7619917/…
classe

36
Esta pode ser a resposta mais curta com maior número de votos em stackoverflow
Sayka

4
considerando o tamanho da resposta e upvotes recebido, eu não acho que qualquer outra resposta em SO bate este :)
Amruta-Pani

2
essas 4 palavras resolveram o meu problema que estou tentando resolver há 3 horas.
Nirup Iyer

64

Serviceestende ContextWrapperque se estende Context. Portanto, o Serviceé a Context. Use a 'this'palavra-chave no serviço.


31
  1. Service estende ContextWrapper
  2. ContextWrapper estende Context

Assim....

Context context = this;

(na classe de serviço ou atividade)


8

Como Serviceé a Context, o contexto da variável deve ser this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Como o Serviço já é um Contexto em si

você pode até conseguir:

Context mContext = this;

OU

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

1

apenas no caso de alguém estar recebendo NullPointerException, você precisa entender o contextoonCreate().

Serviceé a Context, faça o seguinte:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.