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
使用此代码在您的 Activity
或 Application
class
中注册接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
其中 NetworkConnectionReceiver
是由 BroadcastReceiver
扩展的 class。只需在您的应用中添加此 class 并在 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();
}
});
我已经在沙箱中定义了一个接收器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
使用此代码在您的 Activity
或 Application
class
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
其中 NetworkConnectionReceiver
是由 BroadcastReceiver
扩展的 class。只需在您的应用中添加此 class 并在 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();
}
});