81 votos

Android AlarmManager

Por favor alguien puede mostrar algún código de ejemplo de cómo utilizar un AlarmManager en Android.

He estado jugando con algo de código para un par de días y no funcionará.

Necesito activar un bloque de código y después de 20 minutos de la AlarmManager .

102voto

CommonsWare Puntos 402670

"Código de ejemplo" no es fácil cuando se trata de AlarmManager.

Aquí es 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 un disparo de alarma, sólo se puede utilizar set(). Asegúrese de dar la hora para la alarma para iniciar en la misma base de tiempo como de utilizar en el parámetro inicial a set(). En mi ejemplo anterior, estoy utilizando AlarmManager.ELAPSED_REALTIME_WAKEUP, por lo que mi base de tiempo es SystemClock.elapsedRealtime().

Aquí hay una mayor proyecto de ejemplo que muestra esta técnica.

60voto

Default Puntos 4305

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

.\android-sdk\samples\android-10\ApiDemos\src\com\ejemplo\android\api\app

Los check out son:

  • AlarmController.java
  • OneShotAlarm.java

Primero, usted necesita un receptor, algo que puede escuchar su alarma cuando se activa. Agregue lo siguiente a su AndroidManifest.xml archivo

<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 utilizarlo como este

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

de esta manera, usted tendrá 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();
     }
}

7voto

SohailAziz Puntos 1873

Lo que usted necesita hacer es crear primero la intención que usted necesita para programar. A continuación, obtenga el pendingIntent de esa intención. Usted puede programar las actividades, servicios y emisiones. Para programar una actividad de correo.g MyActivity:

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

Dar 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á lanzado después de 5 segundos de la aplicación de lanzamiento, no importa que usted deje su aplicación o dispositivo entró en estado de sueño (debido a RTC_WAKEUP opción). Usted puede leer el código de ejemplo completo de la Programación de las actividades, servicios y emisiones de #Android

2voto

Arnold Puntos 615

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X