2011-12-12 50 views
45

Estoy construyendo una aplicación de alarma. He implementado con éxito funciones básicas de alarma.cómo configurar múltiples alarmas usando android alarm manager

Calendar calendar = Calendar.getInstance(); 
calendar.set(calendar.HOUR_OF_DAY, sHour); 
calendar.set(calendar.MINUTE, sMin); 
calendar.set(calendar.SECOND, 0); 
calendar.set(calendar.MILLISECOND, 0); 
long sdl = calendar.getTimeInMillis(); 

Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
PendingIntent sender = PendingIntent.getBroadcast(AlarmList.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager ALARM1 = (AlarmManager)getSystemService(ALARM_SERVICE); 
ALARM1.set(AlarmManager.RTC_WAKEUP, sdl, sender); 

En mi aplicación, el usuario puede seleccionar días (domingo, lunes ...) para repetir la alarma semanalmente. Estoy intentando crear varias alarmas para repetir semanalmente pero no sé cómo hacerlo. ¿Puedo crearlo utilizando el intervalo (repetición) o debo crear varios administradores de alarmas?

+0

basta con utilizar el campo id ... comprobar la documentación para el conjunto AlarmManager. – Warpzit

+0

Ver mi respuesta en esta publicación http://stackoverflow.com/questions/12785702/android-set-multiple-alarms/31805171#31805171 – Junaid

Respuesta

126

Necesita usar different Broadcast id's para el pending intents. Algo así como esto:

Intent intent = new Intent(load.this, AlarmReceiver.class); 
    final int _id = (int) System.currentTimeMillis(); 
    PendingIntent appIntent = PendingIntent.getBroadcast(this, _id, intent,PendingIntent.FLAG_ONE_SHOT); 

Uso de la hora del sistema debe ser un identificador único para cada pendiente de intención de que el fuego.

+1

Muchas gracias, eso es lo que era buscando y no pudiendo encontrar qué buscar y cómo buscar, finalmente esto resolvió mi problema, muchas gracias amigo :) –

+2

¿cómo podemos eventualmente cancelarlos todos? Necesitamos mantener referencias de _id? –

+1

@ user2427819 sí, para cancelar tenemos que pasar la misma identificación que usamos para PendingIntent.getBroadcast –

10

De the docs:

Si ya existe una alarma para esta intención programado (con la igualdad de dos intentos de ser definido por filterEquals(Intent), entonces será eliminado y reemplazado por éste

Múltiple AlarmManagers no resolvería su problema. Si tienen varias alarmas diferentes (diferentes horas y diferentes días), entonces necesitaría configurar la alarma dentro del BroadcastReceiver cada vez que f encender una alarma anterior.

También necesitaría mantener RECEIVE_BOOT_COMPLETED y tener un BroadcastReceiver para recibir el inicio, de modo que si el teléfono se reinicia, puede volver a programar sus alarmas.

+1

gracias por su ayuda. Lo intentaré – Hassy31

7

Para configurar múltiples alarmas, necesita definir su Intent cada vez para que se distinga de las demás. La forma más fácil me resulta de hacer esto es para establecer el campo data de su Intent algo de la siguiente manera:

// give your alarm an id and save it somewhere 
// in case you want to cancel it in future 
String myAlarmId = ...; 

// create your Intent 
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
intent.setData(Uri.parse("myalarms://" + myAlarmId)); 
... 

el resto de su código @ Hassy31 está bien como está y permanece sin cambios.

Tenga en cuenta que el parámetro requestCode en el método PendingIntent.getBroadcast() (según lo sugerido por @parag) no se utiliza según la documentación, por lo que esta no es la manera correcta de hacerlo.

+1

Hola, ¿dónde dice que no está en uso? – blacharnia

+0

Es posible que esto sea cierto al momento de escribir y que ya no sea cierto. –

2

conjunto Broadcast id para pendingIntent

for (int id = 0; id < 3; id++) { 
     // Define pendingintent 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id,ntent, 0); 
     // set() schedules an alarm 
     alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent); 
} 
Cuestiones relacionadas