9

Я использую BroadcastReceiver с действием TIMEZONE_CHANGED, чтобы сбросить аварийные сигналы с помощью AlarmManager, чтобы убедиться, что будильник срабатывает точно в установленное время, а не на несколько часов раньше или позже, в зависимости от изменения часового пояса ,TIMEZONE_CHANGED намерение принимается каждые несколько секунд

Однако в последнем журнале, отправленном пользователем, я видел информацию о намерении с действием TIMEZONE_CHANGED, которое принимается каждые несколько секунд, при этом пользователь жалуется на то, что приложение является глючным.

Вот OnReceive код моего 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)); 
} 

Намерения фильтр манифеста в:

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

И часть журнала (он идет, как, что в течение часа - полная длина бревна)

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) 

Это Samsung Galaxy S III (Android v 4.1.2). Странная вещь, что не происходит на моем S III. Возможно ли, что пользователь установил на своем устройстве опцию «автоматическое изменение часового пояса поставщиком», и такая информация отправляется каждые несколько секунд?

Кто-нибудь продлил это? Я предполагаю, что я просто добавить опцию, чтобы проверить, если часовой пояс фактически изменился перед обновлением передач, но по-прежнему получать приемник называется каждые несколько секунд ...

+0

Вы пытались включить автоматическое изменение времени на своем SIII и посмотреть, произойдет ли одно и то же? – romo

+0

@romo Да - я не писал это в вопросе, но я проверял его на своем S III, когда эта опция включена и отключена. – Koger

+0

Это старый вопрос, но просто чтобы добавить что-то: я тоже это заметил, и мне кажется, что это происходит, когда у пользователя есть автоматическое изменение времени при + низком уровне подключения. Я предполагаю, что при постоянном переходе с Wi-Fi, сети и ни при каких обстоятельствах каждый раз при каждом подключении вы будете сброшены.Как вы писали в ответ - основная задержка исходит от воссоздания объектов формата даты и т. П., Поэтому очевидным решением было бы сравнить зоны перед тем, как что-либо сделать. – vladimir123

ответ

7

Я до сих пор не знаю, почему изменения часового пояса и набор времени называется так часто, но я смог выработать решение, которое позволяет мне узнать, когда на самом деле нужна реакция.

Также я слушаю только изменения в часовом поясе.

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 
} 

я добавил проверку часового пояса, потому что очень часто я обнаружил, что Althought зоны меняются, они не отличаются по времени в любом случае. Также некоторые пользователи заявили, что они даже не путешествовали куда-нибудь, когда были обнаружены многочисленные изменения в зонах - только регулярные поездки на работу и обратно.

Проверьте ограниченное количество ненужных операций.

+0

Хорошая работа, я пришел к аналогичному решению, но сохранил смещение вместо ID. Я сделал что-то похожее для обновлений времени, когда я игнорирую обновления, когда включен параметр «автоматическое время», предполагая, что изменения времени и времени, связанные с летним временем, будут сопровождаться изменением часового пояса, оставив лишь незначительные корректировки. Когда «auto time» is DISABLE, я отвечаю на все изменения времени, так как они могут быть довольно редкими и важными, когда они происходят. –

+0

Этот ответ кажется правильным ... Однако, не является ли это неправильным? Когда вы сравниваете два смещения, не должно ли оно быть равным «! =»? –

+0

@FerranNegre Вы правы. У меня это было почти год, и только два человека жаловались. И даже тогда я этого не заметил ... Thx для исправления меня – Koger

0

Избегайте прослушивает:

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

кажется они регулярно вызываются, также когда время не установлено, а часовой пояс не изменяется. Я подозреваю, что он связан с пользователем, используя «использование сети с часовым поясом и временем» в настройках телефона.

Если вы действительно сделать нужно слушать эти передачи вы должны проверить, если время действительно существенно изменилось или если его просто коррекция миллисекунды от сети при условии, времени

+0

Чтобы определить, изменилось ли время «действительно изменилось», я сохраняю значение «auto time» и отвечаю на события изменения времени только тогда, когда «автоматическое время» отключено (а также изменения в сохраненных значениях настроек). @ Решение Koger является хорошим IMHO для мониторинга изменения часового пояса (реагируйте только на изменения смещения по GMT). –

Смежные вопросы