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?

user123321
quelle

Antworten:

780

Service ist ein Kontext

Mibollma
quelle
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.

user2138983
quelle
31
  1. Service erweitert ContextWrapper
  2. ContextWrapper erweitert Context

So....

Context context = this;

(in Service- oder Aktivitätsklasse)

Hardik Gajera
quelle
8

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

DataBaseManager dbm = Utils.getDataManager(this);   
Jorgesys
quelle
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; 
Ali Azaz Alam
quelle
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;
}
Prediger Panda
quelle