Android N 不发送 android.net.conn.CONNECTIVITY_CHANGE 广播?

Android N not sending android.net.conn.CONNECTIVITY_CHANGE broadcast?

我已经在沙箱中定义了一个接收器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 会给我视觉指示,看起来 class 甚至从未加载到内存中。

我是否遗漏了 Android N 文档中非常基本的内容?是否有检测连接变化事件的新方法?

面向 Android N (Nougat) 的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们有清单条目来请求这些事件的通知。 运行 的应用程序如果使用 BroadcastReceiver.

请求通知,仍然可以在其主线程上侦听 CONNECTIVITY_CHANGE

查看 Android N (Nougat) 中发生了什么变化。请参考下文link。 Android N Behaviour Changes

使用此代码在您的 ActivityApplication class

中注册接收器
IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTI‌​ON); 
registerReceiver(new NetworkConnectionReceiver(), intentFilter); 

其中 NetworkConnectionReceiver 是由 BroadcastReceiver 扩展的 class。只需在您的应用中添加此 class 并在 onReceive(Context context, Intent intent) 方法中执行操作。

注意:如果您在 Activity 中注册此接收器,请不要忘记注销它。

同时 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();
    }
});