web-dev-qa-db-fra.com

Android: Comment utiliser AlarmManager

J'ai besoin de déclencher un bloc de code après 20 minutes à partir de la définition de AlarmManager.

Quelqu'un peut-il me montrer un exemple de code sur la façon d'utiliser un AlarmManager dans ِ Android?

Je joue avec du code depuis quelques jours et ça ne marchera tout simplement pas.

85
Tom

"Un exemple de code" n'est pas si simple quand il s'agit de AlarmManager.

Voici un extrait montrant la configuration 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);

Dans cet exemple, j'utilise setRepeating(). Si vous voulez une alarme ponctuelle, vous devez simplement utiliser set(). Assurez-vous d'indiquer l'heure de démarrage de l'alarme dans la même base de temps que celle que vous utilisez dans le paramètre initial pour set(). Dans mon exemple ci-dessus, j'utilise AlarmManager.ELAPSED_REALTIME_WAKEUP, Donc ma base de temps est SystemClock.elapsedRealtime().

Voici un exemple de projet plus grand montrant cette technique.

104
CommonsWare

Il existe de bons exemples dans l'exemple de code Android

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

Ceux à vérifier sont:

  • AlarmController.Java
  • OneShotAlarm.Java

Tout d'abord, vous avez besoin d'un récepteur, quelque chose qui peut écouter votre alarme lorsqu'elle se déclenche. Ajoutez ce qui suit à votre fichier AndroidManifest.xml

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

Ensuite, créez la classe suivante

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

Ensuite, pour déclencher une alarme, utilisez ce qui suit (par exemple dans votre activité principale):

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);

.


Ou, mieux encore, créez une classe qui gère tout cela et utilisez-la comme ceci

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

de cette façon, vous avez tout en un seul endroit (n'oubliez pas de modifier le 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();
     }
}
62
Default

Ce que vous devez faire, c'est d'abord créer l'intention que vous devez planifier. Obtenez ensuite l'Intente en attente de cette intention. Vous pouvez planifier des activités, des services et des émissions. Pour planifier une activité, par exemple MyActivity:

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

Donnez cette instance en attente à 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);

Maintenant, MyActivity sera lancée après 5 secondes du lancement de l'application, peu importe que vous arrêtiez votre application ou votre appareil se soit mis en veille (en raison de l'option RTC_WAKEUP). Vous pouvez lire l'exemple de code complet Planification des activités, des services et des émissions #Android

8
SohailAziz

Je voulais commenter mais <50 rep, alors voilà. Rappel amical que si vous utilisez 5.1 ou supérieur et que vous utilisez un intervalle inférieur à une minute, cela se produit:

Suspiciously short interval 5000 millis; expanding to 60 seconds

Voir ici .

4
kurt

Quelques exemples de code lorsque vous souhaitez appeler un service à partir de 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);

Vous n'avez pas à demander de permission aux utilisateurs.

3
Arnold