AlarmManager setExact avec WakefulBroadcastReceiver parfois elle n'est pas exacte
Utilisant Android 19+
setExact en conjonction avec WakefulBroadcastReceiver parfois ne pas tirer sur le temps (peut-être quelques secondes de retard). Je veux dire la plupart du temps qu'il fait. probablement 49 de 50 sa bonne.
Je ne suis pas sûr si c'est juste parce que le système est occupé à l'époque et il ne peut pas gérer la charge de travail ou de ce que
Voici comment j'ai réglé l'alarme:
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(AlarmReceiver.INTENT_FILTER);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, MyApplication.ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, timeToWakeUp, alarmIntent);
Voici mon code récepteur:
public class AlarmReceiver extends WakefulBroadcastReceiver {
public static final String INTENT_FILTER = "myfilter";
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, MyWakefulService.class);
startWakefulService(context, service);
}
}
Et dans le WakefulService
public class MyWakefulService extends IntentService {
....
@Override
protected void onHandleIntent(Intent intent) {
....
Lorsque vous êtes en calculant le temps pour timeToWakeUp, êtes-vous réinitialiser les secondes et les millisecondes à 0?
Je réglez les secondes en conséquence, toutefois, je n'ai pas mis les millisecondes. Je vais essayer ça
et bien je crois réglage de l'millisecondes fait la minuterie encore plus précis, donc merci pour ça. Cependant, elle ne résout pas le problème à la main. Je suis assez sûr que c'est juste parce que le système est tellement occupé que l'événement ne pouvait pas le feu à l'heure exacte. Parce que c'est toujours le cas si je le redémarrage de l'appareil et je le calendrier de l'alarme avant le démarrage en cours de finition. Bien sûr, ce n'est pas le seul moment où il y a un retard, mais je pense que je vais la craie jusqu'à système étant occupé, à moins que je l'entends autrement
Je réglez les secondes en conséquence, toutefois, je n'ai pas mis les millisecondes. Je vais essayer ça
et bien je crois réglage de l'millisecondes fait la minuterie encore plus précis, donc merci pour ça. Cependant, elle ne résout pas le problème à la main. Je suis assez sûr que c'est juste parce que le système est tellement occupé que l'événement ne pouvait pas le feu à l'heure exacte. Parce que c'est toujours le cas si je le redémarrage de l'appareil et je le calendrier de l'alarme avant le démarrage en cours de finition. Bien sûr, ce n'est pas le seul moment où il y a un retard, mais je pense que je vais la craie jusqu'à système étant occupé, à moins que je l'entends autrement
OriginalL'auteur MobileMon | 2014-07-13
Vous devez vous connecter pour publier un commentaire.
Ce comportement est ajouté dans l'API 19:
de AlarmManager.
Important:
setExact()
ne fonctionne toujours pas pour être exact, comme les docs de l'état:Oui, c'est pourquoi, a ajouté le deuxième paragraphe. Il peut encore être inexact, c'est juste livrés d'aussi près que possible.
Tout ce que vous dit aide, mais encore chaque maintenant et puis il ne sera pas le feu (10 secondes de retard). est-ce seulement parce que le système est occupé??? Je ne vois pas d'autre raison
Voici comment j'ai réglé le sur Android 19+ setWindow(AlarmManager.RTC_WAKEUP, timeForNextAlarm, 0, alarmIntent)
OriginalL'auteur CommonGuy
Pour la Guimauve à l'époque(?), nous avons besoin de laide des codes comme ci-dessous... 🙁
Et "delayInMillis" param devrait être de plus de 15 minutes sur l'API 23.
Si pas, le système ignore les minutes moins de 15 minutes.
Et si je peut une autre question, pourquoi n'utilisez-vous pas le setExact(...) pour Construire.VERSION > M? Merci
la méthode n'est pas définie minuteries plus exactement sur Mashmellow. Si vous souhaitez être rappelé (e) sur 07:00 AM et utiliser "setEaxct" la méthode. Le système ne vous appelle pas à 07:00 du matin, dans le DOZE mode. Je pense que vous devriez lire quelques documents sur le DOZE.
setExactAndAllowWhileIdle n'est pas répétition de l'alarme dans la guimauve. Je veux commencer le service de un certain intervalle de temps
Désolé pour la réponse tardive. Vous avez raison. Donc, Nous devrions l'appeler que les codes à plusieurs reprises après la réception de rappel. Appel registerExactAlarm() et de recevoir de rappel du système et appel registerExactAlarm de nouveau. Laissez-moi savoir si il y a une autre solution.
OriginalL'auteur cmcromance