Kontext in einem Dienst abrufen


280

Gibt es einen zuverlässigen Weg, um einen Contextvon einem zu bekommen Service?

Ich möchte einen Rundfunkempfänger für registrieren, ACTION_PHONE_STATE_CHANGEDaber ich brauche meine App nicht, um diese Informationen immer zu erhalten, also lege ich sie nicht in die Manifest.

Ich kann den Broadcast-Empfänger jedoch nicht vom GC töten lassen, wenn ich diese Informationen benötige, sodass ich den Broadcast-Empfänger in a registriere Service.

Daher muss ich Contextanrufen registerReceiver(). Wenn ich das nicht mehr brauche, hebeACTION_PHONE_STATE_CHANGED ich die Registrierung auf .

Irgendwelche Tipps?

Antworten:


780

Service ist ein Kontext


3
Ich hatte dieses Problem, aber es stellte sich heraus, dass es der Arbeitsthread war, der keinen Kontext hatte. Ich habe es gelöst, indem ich beim Erstellen des Threads einen Kontext übergeben habe.
Strg-Alt-Delor

17
Hinweis: Der Kontext innerhalb des Dienstes wird erst bei onStart oder onStartCommand in Diensten sichtbar: stackoverflow.com/questions/7619917/…
Klasse

36
Dies kann die kürzeste Antwort mit den höchsten Stimmen im Stapelüberlauf sein
Sayka

4
In Anbetracht der Größe der Antworten und der erhaltenen Gegenstimmen denke ich, dass keine andere Antwort in SO diese übertrifft :)
Amruta-Pani

2
Diese 4 Wörter haben gerade mein Problem gelöst, das ich seit 3 ​​Stunden zu lösen versucht habe.
Nirup Iyer

64

Serviceerstreckt sich, ContextWrapperwas sich erstreckt Context. Daher Serviceist das ein Context. Verwenden Sie das 'this'Schlüsselwort im Dienst.


31
  1. Service erweitert ContextWrapper
  2. ContextWrapper erweitert Context

So....

Context context = this;

(in Service- oder Aktivitätsklasse)


8

Da a Serviceist Context, muss der variable Kontext sein this:

DataBaseManager dbm = Utils.getDataManager(this);   

5

Als Service ist schon ein Kontext selbst

Sie können es sogar durchbringen:

Context mContext = this;

ODER

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

1

Nur für den Fall, dass jemand etwas bekommt NullPointerException, müssen Sie den Kontext in sich aufnehmenonCreate().

Serviceist ein Context, also mach das:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.