10

TIMEZONE_CHANGED アクションで BroadcastReceiver を使用して、AlarmManager を使用してアラームをリセットし、タイム ゾーンの変更に応じて、数時間前後ではなく、設定した時刻にアラームが正確に実行されるようにします。

ただし、ユーザーから送信された最新のログで、TIMEZONE_CHANGED アクションのインテントに関する情報が数秒ごとに受信され、ユーザーがアプリの不具合について不満を漏らしているのを見ました。

これが私のBroadcastReceiverの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 時間以上続く - ログ全体)

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 では起こりません。ユーザーがデバイスで「プロバイダーによる自動タイムゾーン変更」オプションを有効に設定していて、そのような情報が数秒ごとに送信されている可能性がありますか?

経験した人いますか?ブロードキャストを更新する前にタイムゾーンが実際に変更されたかどうかを確認するオプションを追加するだけだと思いますが、それでも数秒ごとに受信機が呼び出されます...

4

2 に答える 2

9

タイムゾーンの変更とタイムセットが頻繁に呼び出される理由はまだわかりませんが、実際にいつ反応が必要なのかを知ることができる解決策を見つけることができました.

また、現在タイムゾーンの変更のみを聞いています。

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
}

ゾーンの時間チェックを追加しました。これは、ゾーンが変更されても時間に違いがないことがよくあることに気付いたからです。また、一部のユーザーは、ゾーンの多数の変更が検出されたとき、どこにも移動しなかったと主張しました。

限られた数の不要な操作を確認します。

于 2014-11-13T09:53:47.267 に答える
0

次の場合はリッスンしないでください。

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

時間が設定されておらず、タイムゾーンが変更されていない場合でも、定期的に呼び出されるようです。電話の設定で「ネットワークが提供するタイムゾーンと時刻を使用する」を使用しているユーザーにリンクされていると思われます。

これらのブロードキャストを本当にリッスンする必要がある場合は、時間が本当に大幅に変更されているかどうか、またはネットワークが提供する時間からのミリ秒の修正にすぎないかどうかを確認する必要があります

于 2014-11-03T06:15:37.463 に答える