Отримайте контекст у сервісі


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
Це може бути найкоротша відповідь з найвищими голосами в
стаквоверлоку

4
враховуючи розмір отриманої відповіді та отриманих відгуків, я не думаю, що будь-яка інша відповідь так перемагає це :)
Amruta-Pani

2
ці 4 слова просто вирішили мою проблему, яку я намагаюся вирішити протягом 3 годин.
Nirup Iyer

64

Serviceрозширюється, ContextWrapperщо розширюється Context. Отже, Serviceце a Context. Використовуйте 'this'ключове слово в сервісі.


31
  1. Service розширюється ContextWrapper
  2. ContextWrapper розширюється Context

Так....

Context context = this;

(у класі обслуговування чи активності)


8

Оскільки Serviceце a 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.