91 votes

AlarmManager Android

Quelqu'un peut-il s’il vous plaît me montrer un exemple de code sur la façon d’utiliser un `` en ِAndroid.

J’ai été jouer avec certains code pendant quelques jours et il ne fonctionne tout simplement pas.

J’ai besoin de déclencher un bloc de code après 20 minutes de la `` mis.

111voto

CommonsWare Points 402670

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

Voici un extrait montrant la configuration de l' 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 un one-shot d'alarme, vous utilisez set(). Assurez-vous de donner l'heure de l'alarme pour démarrer dans la même base de temps que vous utilisez dans le premier paramètre set(). Dans mon exemple ci-dessus, je suis en utilisant AlarmManager.ELAPSED_REALTIME_WAKEUP, donc mon temps de base est de SystemClock.elapsedRealtime().

Voici un échantillon plus grand projet montrant cette technique.

67voto

Default Points 4305

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

.\android-sdk\samples\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 permet d'écouter votre alarme lorsqu'elle est déclenchée. Ajoutez les lignes suivantes à votre AndroidManifest.xml fichier

<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 la commande suivante (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, 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 dans un seul endroit (n'oubliez pas de modifier l' 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();
     }
}

9voto

SohailAziz Points 1873

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

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

Maintenant MyActivity sera lancé au bout de 5 secondes du lancement de l'application, peu importe que vous arrêter de votre application ou de dispositif s'est en état de veille (en raison de RTC_WAKEUP option). Vous pouvez lire exemple de code complet de la Planification des activités, des services et des émissions de #Android

3voto

Arnold Points 615

Un exemple de code lorsque vous souhaitez appeler un service de l’Alarmmanager :

Il ne faut pas demander à userpermissions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X