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


280

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

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

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

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

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

Ответы:


781

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'ключевое слово в сервисе.


31
  1. Service продолжается ContextWrapper
  2. ContextWrapper продолжается Context

Так....

Context context = this;

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


8

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

DataBaseManager dbm = Utils.getDataManager(this);   

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.