2010-11-10 11 views
43

Je construis une application qui déclenche une alarme via AlarmManager.Comment utiliser getSystemService dans une classe sans activité?

J'aimerais pouvoir appeler l'Alarme via sa propre classe de non-activité, mais comme je ne prolonge pas l'activité, je ne semble pas avoir de 'contexte'. Ce concept me déroute, et j'ai lu les docs sdk.

Comment pourrais-je aller sur l'utilisation:

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

dans ma classe non-activty?

De plus, je suppose que l'obtention du contexte me permettra également d'utiliser SharedPrefs et Intents dans ma classe de non-activité?

Répondre

36

Vous pouvez passer le contexte de la classe non-activité qui est la voie préférée ou vous pourriez résumer le contexte de base de l'application à un singleton qui vous permettra d'accéder au contexte partout dans l'application. Dans certains cas, cela peut être une bonne solution mais dans d'autres, ce n'est certainement pas une bonne solution.

Quoi qu'il en soit, si vous voulez déclencher une alarme via le AlarmManager Je suis assez sûr que l'alarme doit hériter d'un Service ou mieux encore de IntentService et dans ce cas vous avez accès au contexte via this.getBaseContext() ou this.getApplicationContext()

+1

Est-il conseillé de passer le contexte? Cela ne conduit-il pas à une fuite de contexte? – Amit0191

4

Vous devez transmettre un contexte dans la classe de non-activité.

16

Service et Activity héritent de Context - donc quand vous appelez getSystemService dans ces classes, vous appelez vraiment super.getSystemService.

Si vous voulez avoir un Context disponible dans une autre classe, vous pouvez passer un comme argument à une méthode de cette classe, conserver une référence à elle, etc.

Modifier: Exemple de code. Mais sérieusement, il est extrêmement de base - si vous comprenez l'héritage et les méthodes.

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

Je pense que je comprends ce que vous voulez dire. Seriez-vous capable de savoir où je pourrais trouver un exemple de code dans un repo? Merci! – eportermd

12

Vous pouvez essayer ce qui suit, cela vous permet d'obtenir le contexte actuel de la vue.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
Questions connexes