定期的に呼び出されるサービスがあり、ネットワークエラーが発生した場合はネットワークの可用性をチェックし、利用可能なネットワークがない場合、そのサービスのアラームはキャンセルされます。その後、ネットワーク接続のブロードキャスト受信機を使用してネットワークの変更を監視し、ネットワークが再び利用可能になると、タイマーを再起動できるようにします。接続変更受信者がブロードキャストを失っているようです
ただし、予防措置として、サービスを実行する必要があるかどうかを確認して確認するために5分ごとに実行するウォッチドッグタイマーサービスも実行します。たとえば、タイマーが設定されておらず、ネットワークが利用可能である場合、タイマーに問題があることがわかります。
これは私が最近行ってきたことですが、ごくまれにあります。ウォッチドッグタイマーを守っている理由ですが、なぜアラームタイマーが再起動されなかったのかまだ分かりません。
ここでネットワーク受信機です:ここで
public class NetworkConnectivityReceiver extends BroadcastReceiver {
Context context;
@Override
public void onReceive(Context ctx, Intent intent) {
context = ctx;
WakeUpManager wakeUpMgr = new WakeUpManager(context);
if (wakeUpMgr.isWakeUpSet() == false) {
// Log all messages received while the wakeup is not set and it should be.
Log.d(TAG, "The timer is not set, and a network change message was received");
}
// Check if the network is connected, and if so, then restart the timer
}
}
は、その受信機のマニフェストエントリです:
<receiver android:name="com.mycom.receivers.NetworkConnectivityReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
</intent-filter>
</receiver>
私がすることで、ネットワークの可用性をチェック:
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = mgr.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
return true;
}
else {
return false;
}
}
最後のメッセージは、私はログに表示されます:
タイマーが設定され、ネットワークが利用可能ではなかった- はタイマーに
- ウォッチドッグサービスをキャンセル、アクティブなネットワークがありませんサービス:開始タイマー....
したがって、ウォッチドッグは完全に利用可能なネットワーク接続を報告していますが、ネットワーク接続受信者はそのメッセージを受信しませんでした。
興味深いことに、私はそれを考慮していませんでした。追加のロギングステートメントを入れましたが、最後の「接続が失われました」メッセージと、ウォッチドッグがネットワークに戻ってきたとき(メッセージが欠落したことを意味します)の間でアクティブになることはありません。しかし、これらのロギングステートメントはレシーバーで少し下にあるので、レシーバーが呼び出される可能性がありますが、電話はすぐにスリープします。私が遭遇した最初の新しい可能性があるので、私は間違いなくこれを試みます。 – Rob