2011-09-10 6 views
1

私のアプリでは、バックグラウンドで定期的に実行されるアクションを提供したいと思います。だから、IntentServiceを起動するAlarmManagerを使用します。ネットワーク接続が利用可能になるまでの遅延サービスアクション

難しいのは、このバックグラウンドアクションがインターネットに接続する必要があるということです。だから私は、デバイスがロックされているときに接続を強制していないようなWakeLockを使ってみました。

次に、サービスが開始され、すぐに登録を解除するときに、希望のブロードキャストが受信されるとすぐに、 "android.net.conn.CONNECTIVITY_CHANGE"を聞くためのBroadcastReceiverの登録について考えました。

public class BackgroundService extends IntentService { 
    private static final IntentFilter filter = 
     new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
    private static NetworkStateChangedReceiver receiver = 
     new NetworkStateChangedReceiver(); 

    protected void onHandleIntent(Intent intent) { 
     registerReceiver(receiver, filter); 
    } 
} 

私の質問は今ある:この受信機は破壊されることがある限り、何の関係もありませんように、とすぐにサービスが(停止したとして、何の接続が利用できないよう

私のコードは次のようになります)? したがって、ネットワーク接続が利用可能になるまで、その作業を遅らせるサービスをどのように実現できますか?

ありがとうございました。

答えて

1

このレシーバは、サービスが停止するとすぐに破棄されます(接続が利用できない限り何もしません)。

はい。それは数マイクロ秒間生きるでしょう。

したがって、ネットワーク接続が利用可能になるまでサービスを実現するにはどうしたらいいですか?

使用ConnectivityManagergetActiveNetworkInfo()、ちょうどonHandleIntent()を終了し、次のアラームを待ち、接続がありますかどうかを確認し、そうでない場合。

またはCONNECTIVITY_ACTIONレシーバをマニフェストに登録し、アラームをスケジュールしてキャンセルすると、アラームは接続中にのみアクティブになります。

他にもさまざまな戦略がありますが、その2つが出発点です。

+0

私ができることは最高ですが、接続が確立されるまで何度も何度もタスクを開始していますか? –

+0

@ cypressious:これが一つのアプローチです。私は2つの輪郭を描いたが、そのうちの1つはその説明に合わない。 – CommonsWare

+0

私は参照してください。あなたの2番目の提案は、永続的なBroadcastReceiverを登録することです。私の場合、タスクは1日に1〜2回実行されます。それは95%を無視して、5分ごとに放送を処理するのは悪いスタイルではないですか? –

関連する問題