Android ACTION_DATE_CHANGED de diffusion
J'ai un Nexus S, et lorsque je change manuellement la date sur le téléphone, ACTION_DATE_CHANGED n'est pas toujours diffusée. Si je change la date à partir de Fév 13, 2014-le 14 Février 2014, je n'ai pas eu une ACTION_DATE_CHANGED de travail, mais si je l'ai mis à plusieurs années dans le futur, je parfois l'obtenir à feu.
Je peux (99%) vous assure que je ne suis pas en abuser IntentFilters, BroadcastReceivers, etc. Je suis juste curieux de savoir pourquoi cette émission est tellement mal documentée. Une analyse rapide à travers ce & Google montre que les gens ne sont pas sûr si elle se produit lorsque l'utilisateur modifie manuellement, ou lorsque la date roule à 12:00 tous les jours, ou les deux. Mon expérience montre qu'il est assez incohérent concernant les modifications de l'utilisateur et je n'ai pas essayé les modifications du système.
Je vais grep par le biais de l'AFST code et d'isoler tous les points d'où c'est tiré et d'en faire rapport.
Edit: à la question: quelqu'un a une idée de ce qui se passe ici? 🙂
- J'ai vu ça moi aussi, donc probablement pas de votre faute. Encore, quelle est la question? 🙂
- Bonne prise 🙂 en Plus comme une demande de renseignements qu'une vraie question, mais je pense toujours que c'est probablement utile d'avoir sur soi.
- Oh, il était sur le pourquoi et n'est-il aucune solution de contournement 🙂
- Ouais, mais ta réponse était bon quand même (j'ai été la commenter!) Voici ce que j'allais dire: je suis grepping par 3 source des arbres maintenant donc je vais fouiner et voir si je peux isoler ce qui se passe, mais il est bon de savoir qu'il n'est pas juste moi avoir ce problèmes (aussi ACTION_TIME_CHANGED ne semblent feu à chaque fois que le changement de date, de sorte que c'est probablement un coût inférieur solution!). Aussi, je suis en ciblant tout particulièrement l'API 14+, je suis à la recherche par le PSBA 4.0.3_r1, 4.2.2_r1, et certains 4.4 branche, pour ceux qui sont intéressés!
- Bon, je l'ai ramenée, il pourrait être utile pour quelqu'un. Ces Intentions sont certes difficile et peu de mystère pour beaucoup.
Vous devez vous connecter pour publier un commentaire.
Voici le code à partir de 4.0.3_r1 dans frameworks/base/services/java/android/server/AlarmManagerService.java.
Tout d'abord, nous créons un PendingIntent mDateChangeSender;
Puis, dans le constructeur de AlarmManagerService.java nous avons configuré le PendingIntent:
Puis plus tard dans le constructeur:
Donc, qu'est-ce que mClockReceiver? Juste un BroadcastReceiver à l'écoute de l'Intention.ACTION_TIME_TICK et de l'Intention.ACTION_DATE_CHANGED. Dans onReceive():
Puis, plus tard, nous trouvons la méthode scheduleDateChangedEvent():
Donc il définit un one-shot de l'alarme, à commencer par le moment présent, puis réglage de l'heure/min/sec/milli à zéro, alors l'ajout d'un jour, donc si il était 1 h 30 aujourd'hui, la prochaine fois qu'il va être licencié serait en 10 heures et 30 minutes.
Ce n'est pas à dire il n'y a pas de bugs ou quoi que ce soit ici, mais il SEMBLE que ACTION_DATE_CHANGED devrait le feu à minuit tous les jours.
MAINTENANT - si je devais changer la date sur le téléphone permet de dire que sur les 10 prochaines années. Le code pour gérer le changement dans le temps le feu de la première ACTION_DATE_CHANGED événement puis de planifier une nouvelle ACTION_DATE_CHANGED à faire virer, à 10 ans + quelques fraction de jour. Alors, si nous changer la date de retour de 10 ans, à la bonne date, l'alarme est toujours prévue pour être déclenché dans 10 ans, thuse ACTION_DATE_CHANGED n'aura plus de flamme (sauf si vous définissez la date au-delà de 10 ans à partir de maintenant, essayez!).
tl;dr: C'est un bug sur Android.
Correspondant ZachM de recherche, https://code.google.com/p/android/issues/detail?id=2880 enregistre un PSBA d'un bug où une fois que l'horloge se mettre à l'envers,
ACTION_DATE_CHANGED
ne se déclenche pas à nouveau jusqu'à ce que l'horloge se rattrape avec ce qu'allait être la prochaine journée.(Il y a aussi une note il y a environ plusieurs heures de retard dans cette émission. Une conséquence de réglage de l'horloge pour l'essai ou du changement de date, alors que l'appareil est en veille?)
À l'extérieur de l'insecte,
ACTION_DATE_CHANGED
indique que l'horloge atteint le jour suivant, alors queACTION_TIME_CHANGED
(=="android.intent.action.TIME_SET"
) indique que le réglage de l'horloge (ajusté).ZachM du "Si je ce patch..." sonne comme une bonne solution de contournement, en utilisant par exemple une alarme dans une application (pas de diffusion).
MODIFIER
PSBA bug #2880 a un nouveau commentaire soulignant un (autre?) bug dans
scheduleDateChangedEvent()
: Où elle appellecalendar.set(Calendar.HOUR, 0);
, le premier paramètre doit êtreHOUR_OF_DAY
.De java.util.Calendrier:
Donc si
scheduleDateChangedEvent()
fonctionne lors de la PM de la moitié de la journée, la planification de la prochaine alarme pour le midi plutôt que de minuit.J'ai aussi rencontré le même problème. J'ai remarqué que même lors de l'utilisation de
ACTION_TIME_CHANGED
etACTION_DATE_CHANGED
ensemble, je n'étais pas en mesure de détecter toujours lorsque la date a changé. Je pense que c'est un bug dans la plate-forme.J'ai donc ajouté récepteur pour
ACTION_TIME_TICK
et de l'enregistrement de rappel lorsque la date a changé.Vous pouvez réellement utiliser BroadcastReceiver. Utilisez simplement ACTION_TIMEZONE_CHANGED trop.
J'ai fait une belle solution pour ce faire, ici:
https://stackoverflow.com/a/48782963/878126