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();
}
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?
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);
}
}
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é)
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
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);
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);
}