java android alarmmanager android-alarms android-1.5-cupcake

java - Android: cómo usar AlarmManager



android-alarms android-1.5-cupcake (5)

"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.

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 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.


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

<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 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 programar. Luego obtenga la intención pendiente de ese intento. Puede programar actividades, servicios y transmisiones. Para programar 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 Programar 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 here .