Question

Je dois déclencher un bloc de code après 20 minutes de la AlarmManager étant réglée.

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

Je joue autour avec un code pour quelques jours et ça ne fonctionnera pas.

Était-ce utile?

La solution

« Quelques exemples de code » est pas facile quand il vient à 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, je me sers setRepeating(). Si vous voulez une alarme d'un coup, vous utilisez simplement set(). Assurez-vous de donner le temps de l'alarme pour démarrer dans la même base de temps que vous utilisez dans le paramètre initial à set(). Dans mon exemple ci-dessus, je me sers AlarmManager.ELAPSED_REALTIME_WAKEUP, donc ma base de temps est SystemClock.elapsedRealtime().

Voici un projet plus vaste échantillon montrant cette technique.

Autres conseils

Il y a quelques bons exemples dans l'exemple de code Android

  

. \ Samples \ android-sdk \ android-10 \ ApiDemos \ src \ com \ exemple \ Android \ api \ app

Ceux à vérifier sont:

  • AlarmController.java
  • OneShotAlarm.java

D'abord, vous avez besoin d'un récepteur, quelque chose qui peut écouter votre alarme lorsqu'il est déclenché. 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();
     }
}

Alors, 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, faire une classe qui gère tout cela et l'utiliser 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 (ne pas oublier 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();
     }
}

Ce que vous devez faire est de créer d'abord l'intention, vous devez planifier. Ensuite, obtenir le pendingIntent de cette intention. Vous pouvez planifier des activités, des services et des émissions. Pour planifier une activité MyActivity par exemple:

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

Donner cette pendingIntent à 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);

MyActivity sera lancé après 5 secondes du lancement de l'application, peu importe où vous arrêter votre application ou appareil se sont en état de veille (en raison de l'option RTC_WAKEUP) . Vous pouvez lire le code exemple complet , les services et les émissions #Android

Je voulais faire un commentaire, mais <50 représentant, il faut en tenir. Rappel amical que si vous utilisez le 5.1 ou au-dessus et que vous utilisez un intervalle de moins d'une minute, cela se produit:

Suspiciously short interval 5000 millis; expanding to 60 seconds

Voir .

Quelques exemples de code lorsque vous voulez appeler un service de la 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 ne devez pas demander userpermissions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top