2011-10-27 4 views
2

Donc, je suis en train d'essayer d'obtenir quelques intentions de travailler pour moi, et j'ai des problèmes sur 2 intentions spécifiques. J'ai cherché ces groupes et les webs et ne peut pas trouver plus d'informations que ce que me donne la documentation. Il ne semble pas d'importance si je déclare l'utilisation de ces intentions dans le manifeste , ou si j'essaie d'enregistrer un récepteur dans le code, mon récepteur ne reçoit jamais les actions pour ACTION_TIME_CHANGED ou ACTION_DATE_CHANGED. Pour autant que je peux dire que je devrais recevoir ces actions dans mon récepteur de radiodiffusion à chaque fois que l'utilisateur définit explicitement l'heure/date par va "Settings" --> "Date & Time" puis modifier le temps ou la date Suis-je mal interpréter ce que ces actions sont pour? Y at-il des autorisations que je dois déclarer pour recevoir ces actions? Est-ce que quelqu'un a travaillé avec ces actions?ACTION_TIME_CHANGED ou ACTION_DATE_CHANGED, ne peut pas les faire fonctionner

est-il un exemple utile lorsque ces actions sont utilisées, je ne pouvais pas trouver quelque chose d'utile, il y a beaucoup d'exemples de changement de format, mais pas sur le changement time_date réel ...

Merci à l'avance

Répondre

0

À l'intérieur de votre récepteur de radiodiffusion onReceive méthode, je suppose que vous avez une configuration similaire à ce qui suit?

@Override 
public void onReceive(Context context, Intent intent){ 
    final String action = intent.getAction(); 
    if (Intent.ACTION_DATE_CHANGED.equals(action) || Intent.ACTION_TIME_CHANGED.equals(action)){ 
    // do stuff here 
    } 
    ... 
} 

Une autre considération serait avez-vous ajouté les filtres appropriés à votre IntentFilter tels que ...

IntentFilter filter = new IntentFilter(); 
filter.addAction(Intent.ACTION_TIME_CHANGED); 
filter.addAction(Intent.ACTION_DATE_CHANGED); 
+0

est-il des autorisations que je dois ajouter dans mon manifeste? – Lukap

+0

@Lukap Aucune autorisation n'est requise. –

1

Oui, vous devez ajouter

<intent-filter> 
    <action android:name="android.intent.action.DATE_CHANGED"></action> 
</intent-filter> 
2

Intent.ACTION_DATE_CHANGED et Intent.ACTION_TIME_CHANGE D sont déclenchées uniquement lorsque l'utilisateur modifie manuellement l'heure ou la date et qu'il n'est pas automatiquement déclenché par le système.

Je crains que vous deviez utiliser Intent.ACTION_TIME_TICK, qui est déclenché par le système exactement chaque minute.

5

En plus du <intent-filter>, voir Android ACTION_DATE_CHANGED broadcast à propos d'un bug PSBA: ACTION_TIME_CHANGED devrait tirer lorsque l'horloge se prépare et ACTION_DATE_CHANGED devrait tirer lorsque l'horloge fait tic tac plus le lendemain, mais si l'horloge se prépare en arrière, ACTION_DATE_CHANGED won » t tirer à nouveau jusqu'à ce que l'horloge rattrape ce qui allait être le lendemain.

+0

Savez-vous comment résoudre le problème avec ACTION_DATE_CHANGED? –

+0

@hemanthkumar Est-ce que https://stackoverflow.com/q/21758246/1682419 aide? Notez également les changements dans Android O sur [enregistrement pour les intentions de diffusion implicites via le manifeste] (https://developer.android.com/about/versions/oreo/background.html#broadcasts) – Jerry101

0

Une approche alternative que j'avais l'habitude de prendre une action quand la date est changée.

En fait, Intent.ACTION_DATE_CHANGED fonctionne uniquement avec la date d'une date avancée et non avec une date antérieure lorsque vous modifiez manuellement la date sur le téléphone. En outre, lorsque vous définissez l'heure à 11:59 et attendez que cela devienne 00:00 pour vous donner l'événement de diffusion du changement de date, il ne vous donne pas le déclencheur. Donc, j'ai fini par faire ma propre logique de stocker une date dans pref, puis de vérifier si la date actuelle est postérieure ou antérieure à la date stockée (avec une logique de traitement de la date) et de mettre mes données à jour.

private void takesomeActionIfDateIsChanged() { 
    try { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); 

     long currentDateTimeInMillis = System.currentTimeMillis(); 
     Date currentDateWithMillis = new Date(currentDateTimeInMillis); 

     String formattedCurrentDateWithOnlyDMYStr = dateFormat.format(currentDateWithMillis); 
     Log.d(TAG, "formattedCurrentDate With Only DateMonthAndYear String : " + formattedCurrentDateWithOnlyDMYStr); 
     Date formattedCurrentDate = dateFormat.parse(formattedCurrentDateWithOnlyDMYStr); 

     String storedDateStr = mSpManager.getStoredDate(SPManager.STORED_DATE); 
     Log.d(TAG, "storedDateStr : " + storedDateStr); 
     Date storedDateOnlyWithDateMonthAndYear = dateFormat.parse(storedDateStr); 

     if (formattedCurrentDate.after(storedDateOnlyWithDateMonthAndYear)) { 
      Log.d(TAG, "The current date is after stored date"); 
      mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr); 
      mCounter = 0; 
     } else if (formattedCurrentDate.before(storedDateOnlyWithDateMonthAndYear)) { 
      Log.d(TAG, "The current date is before stored date"); 
      mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr); 
      mCounter = 0; 
     } else { 
      Log.d(TAG, "The current date is same as stored date"); 
     } 
    } catch (Exception e) { 
     Log.e(TAG, "exception : ", e); 
    } 
} 
+0

La classe 'Date' est assez obsolète, et le formatage de la date n'est pas nécessaire pour vérifier les valeurs, vous pouvez donc économiser du temps processeur. Vous devriez envisager d'utiliser 'Calendar' ou mieux:' LocalDate' (disponible pour les anciennes versions d'Android via une bibliothèque: https://github.com/JakeWharton/ThreeTenABP). Le 'LocalDate' est beaucoup plus efficace, tant en mémoire qu'en CPU. De cette façon, il peut être très facile de vérifier que la date actuelle est différente de la précédente, et si vous utilisez Kotlin, vous pouvez même utiliser des signes de comparaison normaux (par exemple '! ='). –

+0

@Richa, _quand vous définissez l'heure à 11:59 et attendez qu'il devienne 00:00 pour vous donner l'événement de diffusion du changement de date, il ne vous donne pas le trigger._ -> Cela a fonctionné pour moi. – Joshua

0

Vous n'avez besoin d'aucune autorisation.

Afin d'être informé des changements de date, vous devez vous inscrire à un BroadcastReceiver avec ces actions (et aussi ACTION_TIMEZONE_CHANGED).

Voici une solution que je l'ai fait:

https://stackoverflow.com/a/48782963/878126

Questions connexes