サンドボックスでレシーバーを定義しましたAndroid Nアプリケーション:
<receiver
Android:exported="true"
Android:name="com.sandboxapplication.NetworkReceiver">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
かなり簡単です:
public class NetworkReceiver extends BroadcastReceiver {
private static final String TAG = NetworkReceiver.class.getName();
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Received Network Change event.");
}
}
Build.gradleファイルでtargetSdkVersionが23の場合、このレシーバーは正常に動作しています。ただし、targetSdkVersionを24に設定すると、レシーバーは何も受信しません。実際、デバッグブレークポイントをレシーバーに配置すると、Android Studioは、クラスがメモリにロードされないように見えることを視覚的に示します。
Android Nドキュメントで非常に基本的なものを見逃しましたか?接続変更イベントを検出する新しい方法はありますか?
アプリのターゲティングAndroid N (Nougat)
は、これらのイベントの通知を要求するマニフェストエントリがある場合でも、_CONNECTIVITY_ACTION
_ブロードキャストを受信しません。実行中のアプリは引き続きリッスンできますBroadcastReceiver
で通知を要求する場合、メインスレッドで_CONNECTIVITY_CHANGE
_。
Android N (Nougat)
の変更点を確認するには。以下のリンクを参照してください。 Android N動作の変更
このコードを使用して、Activity
またはApplication
クラスにレシーバーを登録します
_IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
_
NetworkConnectionReceiver
はBroadcastReceiver
によって拡張されたクラスです。このクラスをアプリに追加し、onReceive(Context context, Intent intent)
メソッドでアクションを実行するだけです。
注:このレシーバーをActivity
に登録する場合は、忘れずに登録解除してください。
その間ConnectivityManager.CONNECTIVITY_ACTION
は廃止されました:
@deprecated
apps should use the more versatile {@link #requestNetwork},
{@link #registerNetworkCallback} or {@link #registerDefaultNetworkCallback}
functions instead for faster and more detailed updates about the network
changes they care about.
したがって、registerDefaultNetworkCallback
を使用する必要があります。
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(Network network) {
doOnNetworkConnected();
}
});