Pregunta

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

Puede alguien mostrar código de ejemplo sobre cómo utilizar un AlarmManager en Android?

He estado jugando con algo de código para unos pocos días y no va a funcionar.

¿Fue útil?

Solución

"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 desea una alarma de una sola vez, usted acaba de utilizar set(). Asegúrese de darle a la hora de la alarma para iniciar en la misma base de tiempo como se utiliza en el parámetro inicial para set(). En el ejemplo anterior, estoy usando AlarmManager.ELAPSED_REALTIME_WAKEUP, por lo que mi base de tiempo se SystemClock.elapsedRealtime().

Aquí es un proyecto de ejemplo que muestra mayor esta técnica.

Otros consejos

Hay algunos buenos ejemplos en el código de ejemplo androide

  

. \ Android-SDK \ samples \ android-10 \ ApiDemos \ src \ com \ ejemplo \ apis \ androide \ app

Los que mirar son:

  • AlarmController.java
  • OneShotAlarm.java

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

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

A continuación, cree 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();
     }
}

A continuación, para activar una alarma, utilice el 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, hacer una clase que se encarga de todo y utilizar de esta manera

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 se olvide de 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 hay que hacer primero es crear la intención necesita programar. A continuación, obtener el pendingIntent de esa intención. Puede programar las actividades, servicios y emisiones. 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);

Dar a este pendingIntent 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 será puesto en marcha después de 5 segundos del inicio de la aplicación, no importa que detener su aplicación o dispositivo entraron en estado de suspensión (debido a RTC_WAKEUP opción). Puede leer completa código de ejemplo Programación de actividades, servicios y emisiones #android

quería comentar, pero <50 repeticiones, así que aquí va. recordatorio de que si se está ejecutando en 5.1 o superior y se utiliza un intervalo de menos de un minuto, esto sucede:

Suspiciously short interval 5000 millis; expanding to 60 seconds

aquí .

Algunos código de ejemplo cuando se quiere llamar a un servicio desde el 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);

Usted no tiene que pedir userpermissions.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top