2016-04-05 39 views
35

Android Nでは、「Android NをターゲットとするアプリケーションはCONNECTIVITY_ACTIONブロードキャストを受信しません」という公式サイトに記載されています。また、代替として、JobSchedulerを使用することもできます。しかし、JobSchedulerは、CONNECTIVITY_ACTIONブロードキャストとまったく同じ動作を提供しません。ConnectivityManager.CONNECTIVITY_ACTIONは非推奨です

私のAndroidアプリケーションでは、このブロードキャストを使ってデバイスのネットワーク状態を知りました。私はこの状態がCONNECTIVITY_ACTIONの助けを借りてCONNECTINGまたはCONNECTEDであるかどうかを知りたいと思っていました。私の要求に最も適していました。

これで、現在のネットワーク状態を取得するための代替方法を提案することはできますか。

+9

そして、何OPがいつの日か後にNまたはに 'targetSdkVersion'を増額する必要が何らかの行動を望んでいますか? – Michael

+0

まあ、私もAndroid Nに自分のアプリケーションをターゲットにしないと、私は放送を受信することを知っています。しかし、私のアプリケーションはAndroid Nをサポートする必要があります。Android Nで同じブロードキャスト動作をどうやって得ることができますか?私が試すことができる他のアプローチはありますか? @DavidWasser –

+0

時々、私はそれが将来の将来について心配していると思うことがあります。これは純粋にプログラミングのための実用的なアプローチです。もちろん、コードで廃止予定の機能を使用しないように常に試みることができます。一方、廃止予定の機能は通常、長い間滞在しており、廃止された機能がなくなる前にアプリの寿命が終了する可能性があります。 Android Nはとても新しく、私はそれについて心配するのに多くの時間を費やすことはありません。それでも。ちょうど私の2セント。私は質問にコメントを書いたが、「しないでください」が有効な答えであることを示唆していないことに注意してください。 –

答えて

35

非推奨になるのは、バックグラウンドアプリケーションがネットワーク接続状態の変更を受信する機能です。

David Wasserと同様に、アプリケーションコンポーネントがインスタンス化されていて(破棄されていない)、マニフェストではなくコンテキストにregistered your receiver programmaticallyがある場合、接続の変更を通知できます。

代わりにNetworkCallbackを使用できます。特に、接続状態の変更については、onAvailableを上書きする必要があります。

私はすぐにスニペットを起草してみましょう:

public class ConnectionStateMonitor extends NetworkCallback { 

    final NetworkRequest networkRequest; 

    public ConnectionStateMonitor() { 
     networkRequest = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(); 
    } 

    public void enable(Context context) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     connectivityManager.registerNetworkCallback(networkRequest , this); 
    } 

    // Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too. 

    @Override 
    public void onAvailable(Network network) { 
     // Do what you need to do here 
    } 
} 
+1

このテクニックはアプリケーションがフォアグラウンドで実行されている場合、動作することができます。つまり、アプリケーションがフォアグラウンドで実行されていないときに、接続イベントを待機する機能がなくなったのでしょうか? manifest.xmlでをAndroid N. –

+1

@CheokYanCheng AFAIKに反映されなくなりました。接続イベントを待機するには、フォアグラウンドで実行されるプロセスが必要です。 Androidフレームワークのエンジニアが行った前提は、クライアントとサーバーの間でデータの同期を開始するタイミングを知るために、接続イベントのリスニングが主に行われたようです。したがって、JobSchedulerはそのユースケースに対して推奨される方法です。 –

+7

NetworkCallbackはAPIレベル21+のためのものです – GeneralKimi

12

アンドロイドNのマニュアルに述べて:アンドロイドNをターゲット

アプリは、彼らが要求へのマニフェストのエントリを持っている場合でも、CONNECTIVITY_ACTION 放送を受信しません。これらのイベントの通知 フォアグラウンドで実行されているアプリは、BroadcastReceiverで通知 を要求すると、メインスレッドで CONNECTIVITY_CHANGEを聞くことができます。

これは、ネットワーク接続の変更を検出するために、アプリケーションがフォアグラウンドで実行されている場合でも、BroadcastReceiverを登録できることを意味します。

+0

ニース微妙なキャッチ:) –

+0

これは、アプリケーションがフォアグラウンドにいないと、ブロードキャストの受信を停止することを意味しますか? (私は例えばサービスでそれを聞くことができないので?) – sundie

+0

私は確かにわからない、私は確かにそれをテストする必要があります。しかし、ドキュメンテーションを読むと、あなたのアプリがフォアグラウンドにない場合、ブロードキャストの「Intent」を取得できないように見えます。 –

5

私は数日戻って、同じ問題に遭遇したと私はアプリが実行されているAndroidのバージョンに応じて、このライブラリはJobSchedularGcmNetworkManagerBroadcastReceiverを使用して、このライブラリを使用するAndroid-Job

を決めました。ジョブを開始

はかなり簡単です

new JobRequest.Builder(DemoSyncJob.TAG) 
      .setRequiresCharging(true) 
      .setRequiresDeviceIdle(false) 
      .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) // this is what gets the job done 
      .build() 
      .schedule(); 
+1

私は同じschedlerを試してこのような例外を受け取りました 制約なしでジョブを構築しようとしていますが、これは許可されていません。 あなたはこれを解決するために私たちを助けてもらえますか? –

+0

この目的でAndroid-Jobを使用することは、実際には非常に良い解決策ではありません。指定した時刻に、1回または定期的に物事を実行することを意味します。これは、アラームなどの互換性をサポートすることを目的としています。 これは、APIが変更された理由の全体的なアイデアに反する、と読み: https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html あなたはすぐに感覚を得ることができます 理由に。 – pedronveloso

+0

問題は、Android Nでは、今後最低15分しかスケジュールできないということです –