Получить контекст в сервисе

280

Есть ли надежный способ получить Contextот Service?

Я хочу зарегистрировать радиовещательный приемник, ACTION_PHONE_STATE_CHANGEDно мне не нужно, чтобы мое приложение всегда получало эту информацию, поэтому я не помещаю ее в Manifest.

Однако я не могу позволить, чтобы широковещательный приемник был уничтожен GC, когда мне нужна эта информация, поэтому я регистрирую широковещательный приемник в Service.

Следовательно, мне нужно, Contextчтобы позвонить registerReceiver(). Когда мне больше не нужно, ACTION_PHONE_STATE_CHANGEDя отменяю регистрацию .

Какие-нибудь советы?

user123321
источник

Ответы:

781

Сервис - это контекст

mibollma
источник
3
У меня была эта проблема, но оказалось, что это был рабочий поток, который не имел контекста. Я решил это, передавая контекст при создании потока.
Ctrl-Alt-Delor
17
Примечание. Контекст внутри службы не будет виден до тех пор, пока onStart или onStartCommand в службах не будут отображаться: stackoverflow.com/questions/7619917/…
класс
36
Это может быть самый короткий ответ с наибольшим количеством голосов в stackoverflow
Sayka
4
Учитывая размер ответа и полученных голосов, я не думаю, что какой-либо другой ответ в ТАК превосходит это :)
Amruta-Pani
2
эти 4 слова только что решили мою проблему, которую я пытался решить в течение 3 часов.
Нируп Айер
64

Serviceрасширяется, ContextWrapperчто расширяется Context. Следовательно, Serviceявляется Context. Используйте 'this'ключевое слово в сервисе.

user2138983
источник
31
  1. Service продолжается ContextWrapper
  2. ContextWrapper продолжается Context

Так....

Context context = this;

(в классе обслуживания или деятельности)

Hardik Gajera
источник
8

Поскольку Serviceэто Context, переменная контекст должен быть this:

DataBaseManager dbm = Utils.getDataManager(this);   
Jorgesys
источник
5

Так как сервис уже сам по себе является контекстом

Вы можете даже получить это через:

Context mContext = this;

ИЛИ

Context mContext = [class name].this;  //[] only specify the class name
// mContext = JobServiceSchedule.this; 
Али Азаз Алам
источник
1

на всякий случай, если кто-то получает NullPointerException, вам нужно получить контекст внутриonCreate().

Serviceэто Context, так что сделайте это:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Экклезиаст Панда
источник