web-dev-qa-db-fra.com

Comment utiliser getSystemService dans une classe sans activité?

Je crée une application qui déclenche une alarme via AlarmManager.

J'aimerais pouvoir appeler l'alarme via sa propre classe de non-activité, mais comme je ne prolonge pas Activity, je ne semble pas avoir de "contexte". Ce concept m'embrouille et j'ai lu les documents sdk.

Comment pourrais-je utiliser:

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

dans ma classe de non-activité?

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

52
eportermd

Vous pouvez passer le contexte à la classe de non-activité qui est la méthode préférée ou vous pouvez encapsuler le contexte de base de l'application à un singleton qui vous permettrait d'accéder au contexte n'importe où 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 à peu près sûr que l'alarme devrait hériter d'un Service ou mieux encore de IntentService et dans de tels cas, vous avez accès au contexte via this.getBaseContext() ou this.getApplicationContext()

39
Marek Szanyi

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

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

Modifier: exemple de code. Mais sérieusement, c'est extrêmement basique - 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) {
  }
}
17
Jean Hominal

Vous pouvez essayer ce qui suit, il vous permet d'obtenir le contexte actuel dans lequel la vue est en cours d'exécution.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);
13
Kevin Parker

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

4
Ryan Reeves