2011-07-08 12 views
5

Puedo crear y cancelar una alarma con el siguiente código. Quiero crear más de una alarma. Los tiempos de alarma provienen de una lista de arrays. En esta lista de arrays, me gustaría crear una alarma para cada fecha. Y presionando el botón cancelar cancelará solo la alarma actual. ¿Cómo puedo hacerlo?¿Cómo se puede crear más de una alarma?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    setOneTimeAlarm(); 

    buttonCancel.setOnClickListener(new Button.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
      alarmManager.cancel(pendingIntent); 

      // Tell the user about what we did. 
      Toast.makeText(MainActivity.this, "Cancel!", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

private void setOneTimeAlarm() { 
    Intent intent = new Intent(this, AReceiver.class); 
    pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
} 

Respuesta

3

Voy a publicar un ejemplo con una forma en que lo hice en una de las aplicaciones que creé.

Al llamar a la alarma, debe enviar una identificación adicional como esta: Tmp es un objeto que tiene una ID única.

Intent intent = new Intent(DisplayActivity.this,AlarmReciever.class); 

intent.setData(Uri.parse("timer:"+tmp.getId())); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(DisplayActivity.this,1, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent); 

y luego recuperar el ID con esta línea:

Long.parseLong(intent.getData().getSchemeSpecificPart()) 

Al cancelar acaba de crear la misma intención pendiente con el ID y llamar alarmmanager.cancel()

Editar:

Para cancelar la alarma específica en el elemento que el usuario hizo clic (aquí es donde tmp.getId es útil) Acabo de utilizar este código, creo que debe crear el mismo pendienteInternet para ser ab para cancelar la alarma específica.

Intent intent = new Intent(DisplayActivity.this,AlarmReciever.class); 
intent.setData(Uri.parse("timer:"+tmp.getId())); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(DisplayActivity.this,1, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.cancel(pendingIntent); 

AlarmReciever es mi BroadcastReceiver. DisplayActivity es la actividad en sí misma.

Está en AlarmReciever Tengo el siguiente código:

Long.parseLong(intent.getData().getSchemeSpecificPart()) 
+0

Gracias a la respuesta de David, pero no entiendo cómo lista de fechas en AlarmManager pondré. – realuser

+0

¿Por qué quieres una lista? Esto crea varias alarmas diferentes, simplemente ponga diferentes valores en el objeto de calendario. Guardo una referencia de todas las alarmas en una base de datos local para poder mostrarlas y cancelarlas todas. Recorra y llame a alarmmanager.set en varios o ¿qué quiere decir exactamente? –

+0

Creo que tengo el mismo problema. Tengo servicio desde donde configuré las alarmas. Si configuro más de una alarma, solo funciona la última. Entonces no lo entiendo: si quiero configurar más de una alarma, ¿debo usar ID o las ID son solo para cancelar mi propósito? – Mario

1

Se trata de la continuación de la respuesta de David sobre la forma de obtener ID única.

La ID única puede provenir de la tabla SQLITE. Mientras crea la tabla para almacenar la fecha y hora del recordatorio, tenga una columna _ID con AUTOINCREMENT. Cuando se insertan filas, esta columna obtendrá automáticamente números únicos y únicos. La tabla también lo ayudará a almacenar los recordatorios en caso de que el dispositivo esté apagado y desee volver a crear los recordatorios. Al apagar el dispositivo, creo que las alarmas se perderán.

CREATE TABLE IF NOT EXISTS reminder_datetime 
_ID INTEGER PRIMARY KEY AUTOINCREMENT, 
NOTIF_DATETIME INTEGER; 

Para trabajar con establecer y obtener las fechas de la mesa, objeto de uso Calendario:

Calendar cal = Calendar.getInstance(); 

entonces usted puede utilizar, funciones o cal.setTime cal.setTimeInMillis. De forma similar, obtenga funciones para obtener la fecha.

Usar el formato de fecha si desea dar formato a la fecha legible por uno:

myDate = android.text.format.DateFormat.format("MM/dd/yyyy", cal.getTimeInMillis()).toString(); 
Cuestiones relacionadas