9

Ich verwende einen BroadcastReceiver mit TIMEZONE_CHANGED Aktion, um Alarme mithilfe von AlarmManager zurückzusetzen, um sicherzustellen, dass der Alarm genau zur eingestellten Zeit läuft, nicht einige Stunden früher oder später, abhängig von der Zeitzonenänderung .TIMEZONE_CHANGED Intent wird alle paar Sekunden empfangen

Jedoch in der neuesten Protokoll vom Benutzer gesendet, sah ich Informationen über die Absicht mit TIMEZONE_CHANGED Aktion alle paar Sekunden mit dem Benutzer applaudiert über app ist glitchy erhalten empfangen.

Hier OnReceive Code meines BroadcastReceiver

@Override 
public void onReceive(Context context, Intent intent) { 
    Utils.log("OnTimeChange"); 
    String action = intent.getAction(); 

    if (action.equals(Intent.ACTION_TIME_CHANGED)) { 
     Utils.log("TimeChange"); 
    } else if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { 
     Utils.log("TimeZoneChanged"); 
    } 
    BroadcastsManager.updateBroadcastsFromAlarms(context, 
      AlarmsDbAdapter.getInstance(context)); 
} 

Die Intent-Filter Manifest:

<intent-filter> 
    <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
    <action android:name="android.intent.action.TIME_SET" /> 
</intent-filter> 

Und ein Teil des log (es so, dass für mehr als eine Stunde geht - in voller Länge des log)

1. 19/4 7:41:54 - posting alarm 3 for 8:15 (in 0h) 
2. 19/4 7:44:29 - OnTimeChange 
3. 19/4 7:44:29 - TimeZoneChanged 
4. 19/4 7:44:29 - posting alarm 3 for 8:15 (in 0h) 
5. 19/4 7:44:54 - OnTimeChange 
6. 19/4 7:44:54 - TimeChange 
7. 19/4 7:44:54 - posting alarm 3 for 8:15 (in 0h) 

Es ist ein Samsung Galaxy S III (Android v 4.1.2). Das Seltsame ist, dass das bei meinem S III nicht passiert. Könnte es sein, dass der Benutzer die Option "automatische Zeitzonenänderung nach Anbieter" auf seinem Gerät aktiviert hat und Informationen wie diese alle paar Sekunden gesendet werden?

Hat es jemand erleuchtet? Ich denke, ich werde nur eine Option hinzufügen, um zu überprüfen, ob Zeitzone vor der Aktualisierung Sendungen tatsächlich geändert hat, aber es ist immer noch immer der Empfänger alle paar Sekunden genannt ...

+0

Haben Sie versucht, die automatische Zeitänderung an Ihrem SIII einzuschalten und zu sehen, ob das Gleiche passiert? – romo

+0

@romo Ja - Ich habe es nicht in der Frage geschrieben, aber ich habe es auf meiner S III sowohl mit dieser Option aktiviert und deaktiviert. – Koger

+0

Dies ist eine alte Frage, aber nur um etwas hinzuzufügen: Mir ist das auch aufgefallen und es scheint mir, dass es passiert, wenn der Benutzer eine automatische Zeitänderung bei geringer Konnektivität hat. Ich schätze, wenn man ständig von Wi-Fi, Netzwerk und nie die Zeit wechselt jedes Mal zurückgesetzt wird, wenn Sie eine Verbindung bekommen.Wie Sie in der Antwort geschrieben haben - die Hauptverzögerung kommt von der Neuerstellung von Datumsformatobjekten und dergleichen, also wäre die naheliegende Lösung, die Zonen zu vergleichen, bevor Sie etwas tun. – vladimir123

Antwort

7

Ich weiß immer noch nicht, warum Zeitzone ändern und die Zeit wird so oft genannt, aber ich war in der Lage, eine Lösung auszuarbeiten, die mich herausfinden lässt, wann die Reaktion tatsächlich benötigt wird.

Auch ich höre jetzt nur Zeitzone Änderungen.

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

String oldTimezone = prefs.getString(PREF_TIMEZONE, null); 
String newTimezone = TimeZone.getDefault().getID(); 

long now = System.currentTimeMillis(); 

if (oldTimezone == null || TimeZone.getTimeZone(oldTimezone).getOffset(now) != TimeZone.getTimeZone(newTimezone).getOffset(now)) { 
    prefs.edit().putString(PREF_TIMEZONE, newTimezone).commit(); 
    Logger.log("TimeZone time change"); 
    //update alarms 
} 

Ich addierte Zeitprüfung der Zone, weil sehr oft habe ich herausgefunden, dass althought Zonen ändern, sie in irgendeiner Weise in der Zeit nicht unterscheiden. Auch einige Nutzer behaupteten, dass sie nicht einmal weit gereist seien, wenn zahlreiche Veränderungen in den Zonen festgestellt worden seien - nur regelmäßige Fahrten zur Arbeit und zurück.

Überprüfen Sie die Anzahl der nicht benötigten Operationen.

+0

Gute Arbeit, ich kam zu einer ähnlichen Lösung, behielt aber den Offset statt der ID. Ich habe etwas Ähnliches für Zeitupdates gemacht, wo ich Updates ignoriere, wenn die "auto time" -Einstellung aktiviert ist, vorausgesetzt, dass Zeitzonen- und DST-bezogene Zeitänderungen von einer Zeitzonenänderung begleitet werden, die nur geringfügige Anpassungen übrig lassen. Wenn "auto time" deaktiviert ist, reagiere ich auf alle Zeitänderungen, da sie wahrscheinlich sehr selten und wichtig sind, wenn sie auftreten. –

+0

Diese Antwort scheint richtig zu sein ... Ist die Bedingung nicht falsch? Wenn Sie die beiden Offsets vergleichen, sollte es nicht gleich "! =" Sein? –

+0

@FerranNegre Sie haben Recht. Ich hatte es so für fast ein Jahr und nur zwei Benutzer beschwerten sich. Und selbst dann habe ich das nicht bemerkt ... Danke, dass du mich korrigiert hast – Koger

0

Vermeiden Sie hören für:

<action android:name="android.intent.action.TIME_SET" /> 
<action android:name="android.intent.action.TIMEZONE_CHANGED" /> 

es scheint Sie werden regelmäßig aufgerufen, auch wenn die Zeit nicht eingestellt oder die Zeitzone geändert wurde. Ich vermute, dass es mit dem Benutzer verbunden ist, der "verwendte Zeitzone des Netzes zur Verfügung gestellt und Zeit" in den Telefoneinstellungen verwendet.

Wenn Sie wirklich Notwendigkeit tun für diese Sendungen hören sollten Sie überprüfen, ob die Zeit erheblich wirklich verändert oder wenn es nur eine Millisekunde Korrektur von der Netzwerkzeit zur Verfügung gestellt

+0

Um festzustellen, ob sich die Zeit wirklich geändert hat, behalte ich den Wert für die "Autozeit" -Einstellung bei und reagiert nur dann auf Zeitänderungsereignisse, wenn "Autozeit" deaktiviert ist (sowie Änderungen am Wert der bleibenden Einstellungen). @ Kogers Lösung ist gut IMHO für die Überwachung der Zeitzonenänderung (reagiert nur auf Änderungen im GMT-Offset). –

Verwandte Themen