web-dev-qa-db-fra.com

setRepeating () de AlarmManager se répète après 1 minute, peu importe l'heure réglée (5 secondes dans ce cas, API 18+)

J'ai réglé le temps de répétition sur 5 secondes. Le premier toast apparaît après 5 secondes, mais tous les suivants une fois après 1 minute.
J'ai également essayé le code avec setRepeating (), cela ne fonctionne toujours pas.
voici mon code:

public void constructJob(){

    Intent alertIntent = new Intent(this, AlarmManagerService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this, 0,
            alertIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP,
            GregorianCalendar.getInstance().getTimeInMillis(),
            repeatTime(),
            pendingIntent
    );

}

public long repeatTime(){
    return 5000;
}

AlarmManagerService.Java

public class AlarmManagerService extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "5 seconds have passed",
                            Toast.LENGTH_SHORT).show();
}
19
Nikhil Tambe

La documentation doit être mise à jour. D'après je pense Android 5.1 (API version 22), il y a une période minimale de 1 minute pour répéter les alarmes, et les alarmes ne peuvent pas être définies moins de 5 secondes à l'avenir.

Si vous devez travailler en moins d'une minute, réglez simplement l'alarme directement, puis réglez la suivante à partir du gestionnaire de cette alarme, etc.

Si vous devez effectuer un travail dans les 5 secondes, le publier dans un gestionnaire au lieu d'utiliser le gestionnaire d'alarmes?

17
ctate

N'utilisez pas setRepeating () ou setInExactRepeating, il ne se répétera pas après exactement 5 secondes. Au lieu de cela, essayez de planifier l'alarme une fois, puis replanifiez-la à nouveau dans la méthode onReceive () quelque chose comme ceci. Cela se répétera après un intervalle de temps particulier (5 secondes dans ce cas)

MainActivity.Java

public class MainActivity extends AppCompatActivity {

Button btnStartAlarm, btnStopAlarm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnStartAlarm = (Button) findViewById(R.id.btnStartAlarm);
    btnStopAlarm = (Button) findViewById(R.id.btnStopAlarm);

    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);

    final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    btnStartAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
        }
    });

    btnStopAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.cancel(pendingIntent);
        }
    });
}
 }

AlarmReceiver.Java

public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {

    Log.d("Javed", "onReceive called");
    Toast.makeText(context, "onReceive called", Toast.LENGTH_LONG).show();

    Intent intent1 = new Intent(context, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 100, intent1, 0);
    final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
  }
12
Javed Khatri

J'ai eu exactement le même problème. J'ai passé quelques heures à déboguer ceci, et finalement j'ai découvert que si le temps de répétition est réglé à moins d'une minute, il déclenche toujours l'alarme sur une minute!?

J'ai suivi cet exemple: http://www.compiletimeerror.com/2015/02/how-to-make-alarm-repeat-in-Android-code.html#.Vp5UrCorKM8

et il montre l'alarme se déclenchant sur 8 secondes, mais dans mon cas, ce ne serait pas.

J'ai ensuite essayé de régler le temps de répétition sur quelques minutes et cela a bien fonctionné. J'apprécie également que le déclenchement d'une alarme à partir du récepteur donne des temps de répétition plus précis (un récepteur sert à démarrer le gestionnaire d'alarmes et il est appelé par un filtre d'intention personnalisé)

0
nmirkov

Essayez le code suivant:

Long time = new GregorianCalendar().getTimeInMillis() +  3000;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,5000, pendingIntent);

Une fois que vous avez exécuté ce code, l'alarme se déclenchera d'abord après 3 secondes et toutes les 5 secondes par la suite.

Essayez également d'utiliser un WakefulBroadcastReceiver au lieu de BroadcastReceiver car il semble que le téléphone passe en mode somnolence après un certain temps (si vous êtes sur Android M). Assurez-vous d'inclure l'autorisation WAKE_LOCK Pour l'utiliser correctement.

De plus, vous devez garder à l'esprit que le premier déclenchement de votre alarme ne se fera pas avant l'heure demandée, mais il se peut qu'elle ne se produise pas pendant presque un intervalle complet après cette heure. De plus, bien que la période globale de l'alarme répétée soit telle que demandée, le temps entre deux déclenchements successifs de l'alarme peut varier.

De plus

setInExactRepeating() ne garantit pas la précision du temps de déclenchement. Vous pouvez utiliser setRepeating() avant l'API 19 mais à partir de la livraison des alarmes API 19 (KitKat) est inexacte: le système d'exploitation décalera les alarmes afin de minimiser les réveils et l'utilisation de la batterie. Ce que vous pouvez faire est de définir une alarme non répétitive et lorsque l'alarme se déclenche, vous pouvez réinitialiser l'alarme dans votre BroadcastReceiver Il existe de nouvelles API pour prendre en charge les applications qui nécessitent des garanties de livraison strictes; voir setWindow(int, long, long, PendingIntent) et setExact(int, long, PendingIntent). Les applications dont targetSdkVersion est antérieure à API 19 continueront de voir le comportement précédent dans lequel toutes les alarmes sont délivrées exactement à la demande.

Référence

setInexactRepeating () Documentation officielle

réponse StackOverflow

0
Parag Kadam

Essayez ce code:
Calendar cal = Calendar.getInstance(); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pendingIntent);

0
GIRIDHARAN

Essaye ça

    Calendar cur_cal = new GregorianCalendar();

    PendingIntent pintent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pintent);
    alarm.setRepeating(AlarmManager.RTC, cur_cal.getTimeInMillis(), interval, pintent);
0
Srishti Roy

Essaye ça

public void constructJob(){
Intent alertIntent = new Intent(this, AlarmManagerService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this, 0,
        alertIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        GregorianCalendar.getInstance().getTimeInMillis(),
        1000*5,
        pendingIntent);

}
0
Kishan Soni