web-dev-qa-db-ja.com

Android N Android.net.conn.CONNECTIVITY_CHANGEブロードキャストを送信していませんか?

サンドボックスでレシーバーを定義しました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ドキュメントで非常に基本的なものを見逃しましたか?接続変更イベントを検出する新しい方法はありますか?

16
DanMD

アプリのターゲティングAndroid N (Nougat)は、これらのイベントの通知を要求するマニフェストエントリがある場合でも、_CONNECTIVITY_ACTION_ブロードキャストを受信しません。実行中のアプリは引き続きリッスンできますBroadcastReceiverで通知を要求する場合、メインスレッドで_CONNECTIVITY_CHANGE_。

Android N (Nougat)の変更点を確認するには。以下のリンクを参照してください。 Android N動作の変更

21
Kalpesh Patel

このコードを使用して、ActivityまたはApplicationクラスにレシーバーを登録します

_IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTI‌​ON); 
registerReceiver(new NetworkConnectionReceiver(), intentFilter); 
_

NetworkConnectionReceiverBroadcastReceiverによって拡張されたクラスです。このクラスをアプリに追加し、onReceive(Context context, Intent intent)メソッドでアクションを実行するだけです。

注:このレシーバーをActivityに登録する場合は、忘れずに登録解除してください。

24
Ambar Jain

その間ConnectivityManager.CONNECTIVITY_ACTI‌​ONは廃止されました:

@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();
    }
});
1
eleven