问题
I have defined a receiver in a sandbox Android N application:
<receiver
android:exported="true"
android:name="com.sandboxapplication.NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
It's rather simple:
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.");
}
}
This receiver is working fine if in my build.gradle file my targetSdkVersion is 23. However, if I set my targetSdkVersion to 24, the receiver never receives anything. In fact if I place a debug break point in my receiver Android Studio gives me the visual indication that it looks like the class is never even loaded into memory.
Did I miss something very basic in the Android N documentation? Is there a new way to detect connectivity change events?
回答1:
Apps targeting Android N (Nougat)
do not receive CONNECTIVITY_ACTION
broadcasts, even if they have manifest entries to request notification of these events. Apps that are running can still listen for CONNECTIVITY_CHANGE
on their main thread if they request notification with a BroadcastReceiver
.
To see what changed in Android N (Nougat)
. Please refer below link.
Android N Behaviour Changes
回答2:
Use this code to register receiver in your Activity
or in Application
class
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
Where NetworkConnectionReceiver
is a class extended by BroadcastReceiver
. Just add this class in your app and perform action in onReceive(Context context, Intent intent)
method.
Note: If you register this receiver in an Activity
, don't forget to unregister it.
回答3:
Meanwhile ConnectivityManager.CONNECTIVITY_ACTION
was deprecated:
@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.
So registerDefaultNetworkCallback
should be used:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(Network network) {
doOnNetworkConnected();
}
});
来源:https://stackoverflow.com/questions/39076910/android-n-not-sending-android-net-conn-connectivity-change-broadcast