9

Używam funkcji BroadcastReceiver z działaniem TIMEZONE_CHANGED do resetowania alarmów za pomocą programu AlarmManager, aby upewnić się, że alarm działa dokładnie o ustalonej godzinie, nie kilka godzin wcześniej lub później, w zależności od zmiany strefy czasowej .Intencja TIMEZONE_CHANGED jest odbierana co kilka sekund.

Jednak w najnowszym dzienniku wysłanym przez użytkownika widziałem informację o zamiarach z TIMEZONE_CHANGED działaniem odbieranym co kilka sekund, gdy użytkownik skarżył się, że aplikacja jest niestabilna.

Oto kod onReceive mojego BroadcastReceiver za

@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)); 
} 

manifestu filtr intencji:

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

I część dziennika (to idzie tak przez ponad godzinę - pełna długość dzienniku)

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) 

To Samsung Galaxy S III (Android w wersji 4.1.2). Dziwne jest to, że nie dzieje się to na moim S III. Czy to możliwe, że użytkownik ustawił opcję "automatycznej zmiany strefy czasowej według dostawcy" na swoim urządzeniu i informacje takie jak te są wysyłane co kilka sekund?

Czy ktoś to odrodził? Chyba będę po prostu dodać opcję, aby sprawdzić, czy strefa czasowa rzeczywiście zmienił przed aktualizacją transmisje, ale wciąż jest coraz odbiornik nazywa się co kilka sekund ...

+0

Czy próbowałeś włączyć automatyczną zmianę czasu na swoim SIII i sprawdzić, czy to samo się dzieje? – romo

+0

@romo Tak - nie napisałem tego w pytaniu, ale sprawdziłem to na moim S III zarówno z włączoną i wyłączoną opcją. – Koger

+0

To jest stare pytanie, ale po prostu coś dodać: Zauważyłem to również i wydaje mi się, że dzieje się tak, gdy użytkownik ma automatyczną zmianę czasu na + niską łączność. Sądzę, że przy ciągłym przełączaniu z sieci Wi-Fi, sieci i braku czasu, czas jest resetowany za każdym razem, gdy uzyskujesz połączenie.Jak napisałeś w odpowiedzi - główne opóźnienie pochodzi od odtworzenia obiektów formatu daty i tym podobnych, więc oczywistym rozwiązaniem byłoby porównanie stref przed zrobieniem czegokolwiek. – vladimir123

Odpowiedz

7

ja nadal nie wiem dlaczego zmiany strefy czasowej i czas są tak często nazywane, ale udało mi się wypracować rozwiązanie, które pozwala mi dowiedzieć się, kiedy reakcja jest rzeczywiście potrzebna.

Również teraz słucham tylko zmian strefy czasowej.

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 
} 

dodałem sprawdzanie strefa czasowa, ponieważ bardzo często I okazało się, że strefy althought zmienić, one nie różnią się w czasie w żaden sposób. Również niektórzy użytkownicy twierdzili, że nawet nie podróżowali daleko, gdy wykryto liczne zmiany w strefach - tylko regularne wyjazdy do pracy iz powrotem.

Sprawdź ograniczoną liczbę niepotrzebnych operacji.

+0

Dobra robota, doszedłem do podobnego rozwiązania, ale zachowałem przesunięcie zamiast identyfikatora. Zrobiłem coś podobnego w przypadku aktualizacji czasu, w której ignoruję aktualizacje, gdy włączone jest ustawienie czasu automatycznego, zakładając, że zmianie stref czasowych i czasu letniego towarzyszyć będzie zmiana strefy czasowej, pozostawiając tylko drobne poprawki. Kiedy "automatyczny czas" jest WYŁĄCZONY, odpowiadam na wszystkie zmiany czasu, ponieważ są one prawdopodobnie rzadkie i ważne, gdy się pojawią. –

+0

Ta odpowiedź wydaje się właściwa ... Jednak czy warunek nie jest zły? Kiedy porównujesz te dwie korekcje, czy nie powinna być ona równa "! ="? –

+0

@FerranNegre masz rację. Miałem tak przez prawie rok i tylko dwóch użytkowników skarżyło się. I nawet wtedy nie zauważyłem tego ... Thx, żeby mnie poprawić – Koger

0

Unikać nasłuchując:

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

wydaje są regularnie wywoływane, gdy czas nie został ustawiony, a strefa czasowa zmieniona. Podejrzewam, że jest on połączony z użytkownikiem za pomocą "wykorzystania sieci strefy czasowej i czasu" w ustawieniach telefonu.

Jeśli naprawdę zrobić potrzebę słuchania dla tych programów należy sprawdzić, czy czas naprawdę zmieniła się znacząco lub jeśli jej tylko korekta milisekundy z sieci pod warunkiem czas

+0

Aby ustalić, czy czas "naprawdę się zmienił", utrzymuję wartość ustawienia "auto time" i reaguję na zmiany czasu tylko wtedy, gdy "auto time" jest zignorowane (jak również zmiany wartości utrwalonych ustawień). @ Koger's solution jest dobrym IMHO do monitorowania zmian strefy czasowej (reaguje tylko na zmiany w przesunięciu GMT). –

Powiązane problemy