Bir Hizmette Bağlam Al


280

Bir almak için herhangi bir güvenilir bir yolu var mı Contextbir gelen Service?

İçin bir yayın alıcısı kaydetmek istiyorum ACTION_PHONE_STATE_CHANGED ama her zaman bu bilgileri almak için benim app gerekmez, bu yüzden içine koymak yok Manifest.

Ancak, bu bilgiye ihtiyacım olduğunda yayın alıcısının GC tarafından öldürülmesini sağlayamıyorum, bu yüzden yayın alıcısını bir Service .

Bu nedenle, Contextaramak için a'ya ihtiyacım var registerReceiver(). Artık gerektiğinde ACTION_PHONE_STATE_CHANGEDI kaydını ona.

Herhangi bir ipucu?

Yanıtlar:


781

3
Bu sorunu yaşadım, ancak bağlamı olmayan işçi iş parçacığı olduğu ortaya çıktı. Ben iplik inşa ederken bir bağlam geçen benim çözüldü.
ctrl-alt-delor

17
Not: Hizmetteki bağlam, hizmetlerde onStart veya onStartCommand'a kadar görünmez: stackoverflow.com/questions/7619917/…
sınıf

36
Bu, stackoverflow'daki en yüksek
oylarla

4
cevap boyutu ve alınan upvotes göz önünde bulundurarak, ben SO başka bir cevap sanmıyorum :)
Amruta-Pani

2
Bu 4 kelime, 3 saattir çözmeye çalıştığım sorunumu çözdü.
Nirup Iyer

64

Serviceuzanmaktadır ContextWrapperuzanan Context. Dolayısıyla Servicebir Context. 'this'Hizmette anahtar kelime kullanın .


31
  1. Service uzanır ContextWrapper
  2. ContextWrapper uzanır Context

Yani....

Context context = this;

(Hizmet veya Etkinlik Sınıfında)


8

A Serviceolduğu için Context, değişken bağlam şöyle olmalıdır this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

As Servis zaten olduğunu Bağlam kendisi

bunu bile yapabilirsiniz:

Context mContext = this;

VEYA

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

1

Birisinin alması durumunda NullPointerException, içeriğin içine girmeniz gerekironCreate().

Servicebir Context, bunu yapın:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.