Android: Cómo utilizar AlarmManager

Resuelto Tom asked hace 54 años • 6 respuestas

Necesito activar un bloque de código después de 20 minutos desde que se AlarmManagerconfiguró.

¿ Alguien puede mostrarme un código de muestra sobre cómo usar un AlarmManageren Android?

He estado jugando con algún código durante unos días y simplemente no funciona.

Tom avatar Jan 01 '70 08:01 Tom
Aceptado

"Algún código de muestra" no es tan fácil cuando se trata de AlarmManager.

Aquí hay un fragmento que muestra la configuración de AlarmManager:

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

En este ejemplo, estoy usando setRepeating(). Si desea una alarma de un solo disparo, simplemente use set(). Asegúrese de indicar la hora para que la alarma comience en la misma base de tiempo que utiliza en el parámetro inicial set(). En mi ejemplo anterior, estoy usando AlarmManager.ELAPSED_REALTIME_WAKEUP, por lo que mi base de tiempo es SystemClock.elapsedRealtime().

Aquí hay un proyecto de muestra más grande que muestra esta técnica.

CommonsWare avatar Jul 04 '2009 19:07 CommonsWare

Hay algunos buenos ejemplos en el código de muestra de Android.

.\android-sdk\samples\android-10\ApiDemos\src\com\example\android\apis\app

Los que debes revisar son:

  • AlarmController.java
  • OneShotAlarm.java

En primer lugar, necesita un receptor, algo que pueda escuchar la alarma cuando se activa. Agregue lo siguiente a su archivo AndroidManifest.xml

<receiver android:name=".MyAlarmReceiver" />

Luego, crea la siguiente clase.

public class MyAlarmReceiver extends BroadcastReceiver { 
     @Override
     public void onReceive(Context context, Intent intent) {
         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

Luego, para activar una alarma, use lo siguiente (por ejemplo en su actividad principal):

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

.


O, mejor aún, crea una clase que lo maneje todo y úsala así.

Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);

De esta manera lo tienes todo en un solo lugar (no olvides editar el AndroidManifest.xml)

public class MyAlarm extends BroadcastReceiver {
    private final String REMINDER_BUNDLE = "MyReminderBundle"; 

    // this constructor is called by the alarm manager.
    public MyAlarm(){ }

    // you can use this constructor to create the alarm. 
    //  Just pass in the main activity as the context, 
    //  any extras you'd like to get later when triggered 
    //  and the timeout
     public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
         AlarmManager alarmMgr = 
             (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent intent = new Intent(context, MyAlarm.class);
         intent.putExtra(REMINDER_BUNDLE, extras);
         PendingIntent pendingIntent =
             PendingIntent.getBroadcast(context, 0, intent, 
             PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar time = Calendar.getInstance();
         time.setTimeInMillis(System.currentTimeMillis());
         time.add(Calendar.SECOND, timeoutInSeconds);
         alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                      pendingIntent);
     }

      @Override
     public void onReceive(Context context, Intent intent) {
         // here you can get the extras you passed in when creating the alarm
         //intent.getBundleExtra(REMINDER_BUNDLE));

         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}
default avatar Oct 31 '2011 21:10 default

Lo que debes hacer es primero crear la intención que necesitas programar. Luego obtenga la intención pendiente de esa intención. Podrás programar actividades, servicios y retransmisiones. Para programar una actividad, por ejemplo, MyActivity:

  Intent i = new Intent(getApplicationContext(), MyActivity.class);
  PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
  PendingIntent.FLAG_CANCEL_CURRENT);

Proporcione esta intención pendiente a alarmManager:

  //getting current time and add 5 seconds in it
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.SECOND, 5);
  //registering our pending intent with alarmmanager
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

Ahora MyActivity se iniciará después de 5 segundos del inicio de la aplicación, sin importar que detenga la aplicación o que el dispositivo entre en estado de suspensión (debido a la opción RTC_WAKEUP). Puedes leer el código de ejemplo completo Programación de actividades, servicios y retransmisiones #Android

SohailAziz avatar Jun 19 '2012 08:06 SohailAziz