2010-11-10 4 views
43

Ich baue eine Anwendung, die über AlarmManager einen Alarm auslöst.Wie verwende ich getSystemService in einer Nicht-Aktivitätsklasse?

Ich möchte den Alarm über seine eigene Nicht-Aktivitätsklasse aufrufen können, aber da ich die Aktivität nicht erweitere, habe ich anscheinend keinen "Kontext". Dieses Konzept verwirrt mich, und ich habe die SDK-Dokumente gelesen.

Wie würde ich mich über die Verwendung von:

alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

in meiner nicht-activty Klasse?

Auch nehme ich an, Kontext zu bekommen, erlaubt mir, SharedPrefs und Intents auch in meiner Nicht-Aktivitätsklasse zu verwenden?

Antwort

36

Sie können den Kontext der Nicht-Aktivität Klasse übergeben, die die bevorzugte Art und Weise ist, oder Sie könnte die Basis Rahmen der Anwendung auf ein Singleton einkapseln, die Sie den Kontext einer beliebigen Stelle innerhalb der Anwendung den Zugriff erlauben würde. In manchen Fällen ist dies eine gute Lösung, in anderen ist es sicherlich nicht gut.

Wie auch immer, wenn Sie einen Alarm über die AlarmManager auslösen soll bin ich ziemlich sicher, dass der Alarm von einem Service oder besser noch von IntentService und in solchen Fällen erben sollten Sie haben Zugriff auf den Kontext über this.getBaseContext() oder this.getApplicationContext()

+1

Ist es ratsam, den Kontext zu übergeben? Führt das nicht zu einem Kontextleck? – Amit0191

4

Sie müssen einen Kontext an die Nicht-Aktivitätsklasse übergeben.

16

Service und Activity erben von Context - also, wenn Sie getSystemService in diesen Klassen fordern, Sie sind wirklich super.getSystemService aufrufen.

Wenn Sie ein Context in einer anderen Klasse haben wollen, können Sie einen als Argument an eine Methode dieser Klasse übergeben, halten einen Verweis darauf, usw.

bearbeiten: Codebeispiel. Aber im Ernst, es ist extrem Basic - wenn Sie Vererbung und Methoden verstehen.

class MyActivity extends Activity { // Activity extends Context, so MyActivity also extends Context 
    void someMethod() { 
    MyOtherClass.useStaticContext(this); 
    MyOtherClass instance = new MyOtherClass(); 
    instance.useInstanceContext(this.getApplicationContext()); 
    } 
} 
class MyOtherClass { 
    static void useStaticContext(Context context) { 
    } 
    void useInstanceContext(Context context) { 
    } 
} 
+2

Ich denke, ich verstehe, was du meinst. Würdest du zufällig wissen, wo ich in einem Repo einen Beispielcode finden könnte? Vielen Dank! – eportermd

12

Sie können Folgendes versuchen: Sie erhalten den aktuellen Kontext, in dem die Ansicht ausgeführt wird.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
Verwandte Themen