2012-06-07 10 views
28

Estoy atascado. Cuando comience mi aplicación, quiero verificar si hay una alarma activa que configuré previamente. Si no, entonces quiero configurarlo.¿Hay alguna forma de verificar si ya hay una alarma configurada?

Me he referido a this solution. Estoy tratando de hacer coincidir la intención de esta manera:

Intent intent = new Intent(); 
     intent.setAction("com.vit.upload"); 
     PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 

Pero no funciona. ¿Qué más podría funcionar?

Respuesta

65

En primer lugar, un pequeño tutorial sobre cómo acceder a las alarmas creadas anteriormente:

Puede diferenciar entre las alarmas mediante la creación de cada uno con un identificador único, tales como:

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

Cuando se desea acceder esta alarma, debe crear el mismo PendingIntent con la misma identificación única. Por ejemplo, lo siguiente solo accederá a una alarma que haya creado con PendingIntent id 1234. Luego, cancelará la anterior y la restablecerá.

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

La idea es simple. Mantenga un registro de los identificadores y luego utilícelos para acceder a sus respectivas alarmas. Si crea varias alarmas con la misma identificación, la más reciente cancelará la anterior.

Al llegar a su problema principal, en lugar de verificar si su alarma está activa cada vez que inicia su aplicación, simplemente vuelva a establecerla en el método onCreate() de su actividad. con el mismo PendingIntent que he descrito anteriormente. Esto le ahorra toda la molestia de verificar si la alarma está configurada previamente o no. Dado que su objetivo es mantener activa la alarma, no hará daño anular la configuración anterior cada vez que inicie la aplicación. Solo asegúrate de usar la misma identificación para crear tu PendingIntent.

No olvide verificar si la hora de su alarma ya ha pasado o no para evitar intentar establecer una alarma para un tiempo pasado, que la activará inmediatamente.

Consideremos otro caso: cuando apague su dispositivo, todas sus alarmas serán canceladas. Esto no le deja otra opción que configurarlos nuevamente al reiniciar. Para hacer eso, tendrá que usar un BroadcastReceiver.

This answer te ayudarán a saber cómo hacerlo. Simplemente recree su alarma en el método onReceive() de su BroadcastReceiver como se sugiere arriba.

+0

Hola gracias por el trabajo ... Pero ¿cuál será el caso si no tengo actividad ... entonces mi receptor de transmisión completo no funcionará en ese caso (caso con la versión 3.0 de Android en adelante) ... Entonces, ¿cómo se puede pensar ... porque estoy trabajando en una aplicación así que no quieren ninguna actividad ... entonces cómo registrar ese receptor. – NullPointerException

+0

Solo necesita usar etiquetas . Mira esto: http: //developer.android.com/guide/topics/manifest/receiver-element.html. Si está utilizando un servicio para crear su alarma, entonces necesita cambiar el nombre de la actividad anterior a su nombre de clase de servicio. – Erol

+0

¡Bien, está bien! esta es la mejor respuesta que tengo, ¡así que la recomiendo! – NullPointerException

5
  • La primera alarma no funcionará cuando reinicie su dispositivo Android.
  • Puede usar las preferencias compartidas booleanas para verificar que la alarma se haya creado o no.
  • Android pendientes de utilización intención la Steam ID

    int request_code = 2,344; // Steam ID
    PendingIntent pIntent = PendingIntent.getBroadcast (contexto, request_code, la intención, PendingIntent.FLAG_NO_CREATE);

usted tiene que utilizar la emisión Receptor de arranque cuando el sistema se reinicie a continuación, crear de nuevo Alaram con el mismo código de solicitud REQUEST_CODE=2344;

+0

Oye, esto parece una buena sugerencia, pero el problema básico sigue siendo el mismo .. ¿Cómo verificarlo? ¿Ya está listo o no? y si hay un procedimiento para verificarlo, ¿dónde debería escribir el código? Quiero decir cuando comienza mi aplicación o en cualquier otra actividad? por favor ayúdenme ... – NullPointerException

3

Basiclly de mi experiancia si se utiliza la misma intención y FLAG_UPDATE_CURRENT, puede estar seguro de que no tendrá dos alarmas establecidas para el mismo intento. También puede mirar de cerca el FLAG_NO_CREATE que se usa con las funciones get y devuelve null si ya existe un intento pendiente con la intención descrita.

Recuerde también usar el mismo ID de solicitud para intento pendiente ya que son distinguibles.

+0

Szczygiel Muy cierto, mi experiencia también dice que al usar el mismo intento y usar setInexactRepeating, FLAG_UPDATE_CURRENT funciona ... –

1

Según la información here, no parece haber una llamada que pueda hacer para verificar directamente si existe o no una alarma, pero sí ofrecen algunas soluciones.

Cuestiones relacionadas