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

J'ai réglé le temps de répétition à 5 secondes. Le premier toast apparaît après 5 secondes, mais tout le reste une fois répété après 1 minute.
J'ai essayé le code avec setRepeating () ainsi, ça 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

  • L'affichage / l'aperçu de l'appareil photo en plein écran ne maintient pas le rapport d'aspect - l'image est inclinée, tendue pour s'adapter à l'écran
  • Android: voisinCellInfo toujours vide!? Pourquoi?
  • Cordova: Est-il possible d'avoir des identifiants d'applications différents pour les plates-formes Android et ios?
  • Le comportement de la mise en page Android n'est pas appelé lorsque l'enfant de CollapsingToolbarLayout
  • Support de téléphone et de tablette pour l'espacement des boutons sur la vue de disposition
  • Comment lire les journaux d'appels après l'appel terminé et stocké dans les journaux?
  •  public class AlarmManagerService extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "5 seconds have passed", Toast.LENGTH_SHORT).show(); } 

    7 Solutions collect form web for “SetRepeating () de AlarmManager se répète après 1 minute, quelle que soit l'heure réglée (5 secondes dans ce cas, API 18+)”

    La documentation doit être mise à jour. À partir de je pense que Android 5.1 (API version 22), il existe une durée minimale de 1 minute pour la répétition des alarmes, et les alarmes ne peuvent pas être réglées moins de 5 secondes dans le futur.

    Si vous devez travailler en moins d'une minute, il suffit de régler l'alarme directement, puis de configurer la suivante du gestionnaire de cette alarme, etc.

    Si vous avez besoin de travailler dans les 5 secondes, postez-le à un gestionnaire au lieu d'utiliser le gestionnaire d'alarme?

    N'utilisez pas setRepeating () ou setInExactRepeating, il ne se répétera pas après exactement 5 secondes. Au lieu de cela, essayez de programmer l'alarme une fois, puis reportez-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); } } 

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

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

    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 après.

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

    En outre, vous devez garder à l'esprit que le premier déclencheur de votre alarme ne sera pas avant l'heure demandée, mais cela pourrait ne pas se produire pendant presque un intervalle complet après cette période. En outre, pendant que la durée globale de l'alarme répétitive sera effectué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 en commençant par la livraison d'alarme API 19 (KITKAT) est inexact: le système d'exploitation désélectionnera les alarmes afin de minimiser les réveils et l'utilisation de la batterie. Ce que vous pouvez faire, définissez une alarme non répétitive et lorsque l'alarme déclenche, vous pouvez réinitialiser l'alarme dans votre BroadcastReceiver Il existe de nouvelles API pour prendre en charge les applications nécessitant des garanties de livraison strictes; Voir setWindow(int, long, long, PendingIntent) et setExact(int, long, PendingIntent) . Les applications dont TargetSdkVersion est antérieur à l'API 19 continueront à voir le comportement précédent dans lequel toutes les alarmes sont livrées exactement lorsque demandé.

    Référence

    SetInexactRepeating () Documentation officielle

    StackOverflow answer

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

    J'ai eu exactement le même problème. J'ai passé quelques heures à déboguer cela, et enfin j'ai découvert que si le temps de répétition était inférieur à une minute, il déclenche toujours l'alarme sur un horaire horaire!

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

    Et il montre que l'alarme se déclenche sur 8 secondes, mais dans mon cas, elle ne le fera pas.

    Que j'ai essayé de régler le temps de répétition à quelques minutes et ça a bien fonctionné. J'apprécie également que l'alarme de tir du récepteur donne des temps de répétition plus précis (un récepteur est pour le démarrage du gestionnaire d'alarme et il est appelé par filtre d'intention personnalisé)

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.