我使用带有时区更改操作的广播接收器,使用AlarmManager重置警报,只是为了确保警报准确地在设置的时间运行,而不是在几个小时之前或之后,具体取决于时区的更改。
不过,在用户发送的最新日志中,我看到每隔几秒钟就会收到有关使用时区更改操作的意图的信息,用户抱怨应用程序有问题。
这是我的广播接收器的onreceive代码

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

这是三星Galaxy S III(Android V 4.1.2)。奇怪的是,这在我的S III上没有发生。
可能是用户在其设备上设置了“提供商自动更改时区”选项,并每隔几秒钟发送一次类似的信息?
有人解释过吗?我想我会在更新广播之前添加一个选项来检查时区是否真的改变了,但是它仍然每隔几秒钟就让接收器调用一次…

最佳答案

我仍然不知道为什么时区的改变和时间设置被如此频繁地调用,但我能够找到一个解决方案,让我知道什么时候真正需要反应。
我现在只听时区的变化。

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
}

我添加了区域的时间检查,因为我经常发现,尽管区域发生了变化,但它们在时间上没有任何不同。还有一些用户声称,当检测到区域中的许多变化时,他们甚至不会去很远的地方旅行——只是经常往返于工作地点。
检查有限数量的不需要的操作。

07-26 07:22