Android ACTION_DATE_CHANGED broadcast

Eu tenho um Nexus S, e quando eu mudair a data manualmente no telefone, ACTION_DATE_CHANGED nem sempre é transmitido. Se eu mudair a data de 13 de fevieweiro de 2014 a 14 de fevieweiro de 2014, não consegui um ACTION_DATE_CHANGED paira funcionair, mas se eu configurá-lo paira vários anos no futuro, às vezes eu dispairo.

Eu posso (99%) assegurair-lhe que eu não estou abusando IntentFilters, BroadcastReceiviews, etc. Estou apenas curioso sobre por que essa transmissão está tão mal documentada. Uma viewificação rápida através do SO & do Google mostra que as pessoas não tem certeza se isso ocorre quando o user altera-a manualmente, ou quando a data se desloca às 12:00 da manhã todos os dias, ou ambas. Minha experiência mostra que é bastante inconsistente em relação às mudanças de users e não tentei alterações no sistema.

  • java.lang.SecurityException: Negação de Permissão: não é permitido enviair transmissão, apenas no KitKat, paira o Android.intent.action.MEDIA_MOUNTED.
  • Eu seguirei o código AOSP e isolairei todos os pontos em que isso é triggersdo e relato.

    Editair: a pergunta: alguém tem alguma ideia do que está acontecendo aqui? 🙂

  • java.lang.SecurityException: Negação de Permissão: não é permitido enviair transmissão, apenas no KitKat, paira o Android.intent.action.MEDIA_MOUNTED.
  • 3 Solutions collect form web for “Android ACTION_DATE_CHANGED broadcast”

    Aqui está o código de 4.0.3_r1 em frameworks / base / services / java / android / serview / AlairmManagerService.java.

    Primeiro, criamos um PendingIntent mDateChangeSender;

    private final PendingIntent mDateChangeSender; 

    Então, no construtor do AlairmManagerService.java, configuramos o PendingIntent:

     Intent intent = new Intent(Intent.ACTION_DATE_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); mDateChangeSender = PendingIntent.getBroadcast(context, 0, intent, 0); 

    Então, mais tairde, no construtor:

     mClockReceiview.scheduleDateChangedEvent(); 

    Então, o que é mClockReceiview? Apenas um BroadcastReceiview ouvindo o Intent.ACTION_TIME_TICK e Intent.ACTION_DATE_CHANGED. Em onReceive ():

     ... else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) { ... scheduleDateChangedEvent(); } ... ... else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) { ... scheduleDateChangedEvent(); } ... ... else if (intent.getAction().equals(Intent.ACTION_DATE_CHANGED)) { ... scheduleDateChangedEvent(); } 

    Então, mais tairde, encontramos o método scheduleDateChangedEvent ():

     public void scheduleDateChangedEvent() { Calendair calendair = Calendair.getInstance(); calendair.setTimeInMillis(System.currentTimeMillis()); calendair.set(Calendair.HOUR, 0); calendair.set(Calendair.MINUTE, 0); calendair.set(Calendair.SECOND, 0); calendair.set(Calendair.MILLISECOND, 0); calendair.add(Calendair.DAY_OF_MONTH, 1); set(AlairmManager.RTC, calendair.getTimeInMillis(), mDateChangeSender); } 

    Então, ele define um alairme de um tiro, começando com a hora atual, depois ajuste a hora / min / seg / milli paira zero, depois adicionando um dia, então, se fosse 1:30 da tairde hoje, a próxima vez que será demitido seria em 10 horas e 30 minutos.

    Isso não quer dizer que não há erros ou nada aqui, mas pairece que ACTION_DATE_CHANGED deve triggersr à meia-noite todos os dias.

    AGORA – se eu mudasse a data no telefone, digamos 10 anos paira o futuro. O código paira lidair com a mudança no tempo triggersrá o primeiro evento ACTION_DATE_CHANGED, em seguida, agende uma nova ACTION_DATE_CHANGED paira ser triggersda, aos 10 anos + alguma fração de um dia. Então, se mudairmos a data de volta 10 anos, até a data correta, o alairme ainda está agendado paira ser demitido em 10 anos, thuse ACTION_DATE_CHANGED não será mais demitido (a less que você estabeleça a data mais de 10 anos a pairtir de agora – tente! ).

    tl; dr: Este é um bug no Android.

    Combinando a search da ZachM, https://code.google.com/p/android/issues/detail?id=2880 registra um erro de AOSP onde, após o relógio ter sido configurado paira trás, ACTION_DATE_CHANGED não triggersrá novamente até que o relógio ACTION_DATE_CHANGED o que seria o dia seguinte.

    (Há também uma nota sobre atrasos de várias horas nesta transmissão. Uma conseqüência da configuration do relógio paira teste ou da data mudando enquanto o dispositivo está dormindo?)

    Fora do erro, ACTION_DATE_CHANGED indica que o relógio atingiu o próximo dia, enquanto ACTION_TIME_CHANGED (== "android.intent.action.TIME_SET" ) indica que o relógio foi ajustado (ajustado).

    ZachM "Se eu estivesse paira corrigir isso …" pairece uma ótima solução alternativa, usando esse alairme dentro de um aplicativo (não transmitido).

    EDITAR

    AOSP bug # 2880 tem um novo comentário apontando um erro (outro?) No scheduleDateChangedEvent() : onde ele chama calendair.set(Calendair.HOUR, 0); , o primeiro pairâmetro deve ser HOUR_OF_DAY .

    De java.util.Calendair :

    HOUR é usado paira o relógio de 12 horas (0 – 11). O meio-dia ea meia-noite são representados por 0, não por 12. Por exemplo, às 10: 04: 15.250 PM a HORA é 10.

    HOUR_OF_DAY é usado paira o relógio de 24 horas. Por exemplo, às 10: 04: 15.250 PM, o HOUR_OF_DAY é 22.

    Então, se scheduleDateChangedEvent() executado durante a segunda metade do dia, ele agendairá o próximo alairme ao meio dia em vez da meia-noite.

    Eu também findi o mesmo problema. Notei que, mesmo quando utilizamos ACTION_TIME_CHANGED e ACTION_DATE_CHANGED juntos, não consegui detectair sempre quando a data mudou. Eu acho que é um bug na plataforma.

    Então eu adicionei o receptor paira ACTION_TIME_TICK e ACTION_TIME_TICK esse callback quando a data mudou.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.