2010-11-10 9 views
43

Estoy construyendo una aplicación que activa una alarma a través de AlarmManager.¿Cómo usar getSystemService en una clase no activa?

Me gustaría poder llamar a la alarma a través de su propia clase no activa, pero como no estoy ampliando la actividad, no parece tener ningún 'contexto'. Este concepto me confunde y he leído los documentos sdk.

¿cómo iba a ir sobre el uso:

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

en mi clase no activty?

Además, supongo que obtener contexto me permitirá usar SharedPrefs y Intents en mi clase no activa también?

Respuesta

36

Puede pasar el contexto de la clase no-actividad que es la manera preferida o usted podría encapsular el contexto de la base de la aplicación de un producto único que permitirá acceder a cualquier lugar dentro del contexto de la aplicación. En algunos casos, esta podría ser una buena solución, pero en otros no es una buena solución.

De todos modos, si desea activar una alarma a través de la AlarmManager estoy bastante seguro de que la alarma debe heredar de una Service o mejor aún de IntentService y en tales casos se tiene acceso a través del contexto o this.getBaseContext()this.getApplicationContext()

+1

¿Es aconsejable pasar el contexto? ¿Eso no lleva a una fuga de contexto? – Amit0191

4

Debe pasar un contexto a la clase no activa.

16

Service y Activity heredan de Context - así que cuando usted está llamando getSystemService en estas clases, en realidad estás llamando super.getSystemService.

Si usted quiere tener un Context disponible en otra clase, puede pasar una como un argumento a un método de esa clase, mantener una referencia a la misma, etc.

Editar: Ejemplo de código. Pero en serio, es extremadamente básico - si usted entiende la herencia y los métodos.

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

Creo que entiendo lo que quieres decir. ¿Sabrías por casualidad dónde podría encontrar el código de muestra de esto en un repositorio? ¡Gracias! – eportermd

12

Puede intentar lo siguiente, le permite obtener el contexto actual por el que se está ejecutando la vista.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE); 
Cuestiones relacionadas