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?

user123321
fonte

Respostas:

780

Serviço é um contexto

mibollma
fonte
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.

user2138983
fonte
31
  1. Service estende ContextWrapper
  2. ContextWrapper estende Context

Assim....

Context context = this;

(na classe de serviço ou atividade)

Hardik Gajera
fonte
8

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

DataBaseManager dbm = Utils.getDataManager(this);   
Jorgesys
fonte
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; 
Ali Azaz Alam
fonte
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;
}
Panda eclesiástico
fonte