2010-11-10 12 views
43

Sto costruendo un'applicazione che attiva un allarme tramite AlarmManager.Come utilizzare getSystemService in una classe di non attività?

Mi piacerebbe essere in grado di chiamare l'allarme attraverso di essa la propria classe non-attività, ma dal momento che non rivolgo attività, non sembra avere alcun 'contesto'. Questo concetto mi confonde e ho letto i documenti sdk.

Come potrei fare per utilizzare:

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

nella mia classe non activty?

Inoltre, sto assumendo ricevendo contesto mi permetterà di utilizzare SharedPrefs e Intenti nella mia classe non-attività come bene?

risposta

36

È possibile passare il contesto della classe non-attività, che è il modo preferito o si può incapsulare il contesto di base della richiesta di un Singleton che consentirebbe di accedere al contesto ovunque all'interno dell'applicazione. In alcuni casi questa potrebbe essere una buona soluzione, ma in altri non è certamente una buona soluzione.

In ogni caso, se si vuole attivare un allarme tramite il AlarmManager sono abbastanza sicuro l'allarme dovrebbe ereditare da un Service o meglio ancora da IntentService e in questi casi si ha accesso al contesto tramite this.getBaseContext() o this.getApplicationContext()

+1

È consigliabile passare il contesto? Non porta a perdita di contesto? – Amit0191

4

È necessario passare un contesto nella classe non-attività.

16

Service e Activity ereditano da Context - in modo che quando si sta chiamando getSystemService in queste classi, siete veramente chiamando super.getSystemService.

Se si desidera avere un Context disponibile in un'altra classe, è possibile passare uno come argomento a un metodo di quella classe, mantenere un riferimento ad esso, ecc

Edit: Esempio di codice. Ma seriamente, è estremamente di base - se capisci l'ereditarietà e i metodi.

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

Penso di capire cosa intendi. Sapresti dove posso trovare il codice di esempio di questo in un repository? Grazie! – eportermd

12

È possibile provare quanto segue, che consente di ottenere il contesto corrente in cui viene eseguita la vista.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
Problemi correlati