Android: cómo usar AlarmManager

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

¿Puede alguien mostrarme un código de muestra sobre cómo usar un AlarmManager en Android?

He estado jugando con algunos códigos durante unos días y simplemente no funciona.

“Algunos ejemplos de código” 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 quiere una alarma de un solo disparo, simplemente usaría set() . Asegúrese de dar tiempo para que la alarma comience en la misma base de tiempo que usa en el parámetro inicial para 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.

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 deben verificar son:

  • AlarmController.java
  • OneShotAlarm.java

Primero, necesitas un receptor, algo que pueda escuchar tu alarma cuando se active. Agregue lo siguiente a su archivo AndroidManifest.xml

  

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 maneje todo y utilízalo 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(); } } 

Lo que debe hacer primero es crear la intención que necesita progtwigr. Luego obtenga la intención pendiente de ese bash. Puede progtwigr actividades, servicios y transmisiones. Para progtwigr una actividad, p. Ej. MyActivity:

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

Dale este pendiente 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 lanzará después de 5 segundos de iniciado la aplicación, sin importar si detiene su aplicación o si el dispositivo entró en estado de suspensión (debido a la opción RTC_WAKEUP). Puede leer el código de ejemplo completo Progtwigr actividades, servicios y transmisiones #Android

Quise comentar pero <50 rep, así que aquí va. Recordatorio agradable de que si se está ejecutando en 5.1 o superior y utiliza un intervalo de menos de un minuto, esto sucede:

 Suspiciously short interval 5000 millis; expanding to 60 seconds 

Mira aquí .

Algunos ejemplos de código cuando desea llamar a un servicio desde Alarmmanager:

 PendingIntent pi; AlarmManager mgr; mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class); pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0); mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi); 

No tienes que pedir permiso al usuario.