J'ai défini un récepteur dans une application Sandbox Android N:
<receiver
Android:exported="true"
Android:name="com.sandboxapplication.NetworkReceiver">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
C'est assez 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.");
}
}
Ce récepteur fonctionne correctement si, dans mon fichier build.gradle, targetSdkVersion est à 23. Cependant, si je règle mon targetSdkVersion sur 24, le récepteur ne reçoit jamais rien. En fait, si je place un point d'arrêt de débogage dans mon récepteur, Android Studio me donne l'indication visuelle qu'il semble que la classe n'est jamais chargée en mémoire.
Ai-je oublié quelque chose de très basique dans la documentation d'Android N? Existe-t-il un nouveau moyen de détecter les événements de changement de connectivité?
Les applications ciblant Android N (Nougat)
ne reçoivent pas les émissions CONNECTIVITY_ACTION
, même si elles possèdent des entrées de manifeste pour demander la notification de ces événements. Les applications en cours d'exécution peuvent toujours écouter CONNECTIVITY_CHANGE
sur leur thread principal si elles demandent une notification avec une BroadcastReceiver
.
Pour voir ce qui a changé dans Android N (Nougat)
. Veuillez vous référer au lien ci-dessous . Changements de comportement Android N
Utilisez ce code pour inscrire le destinataire dans votre classe Activity
ou Application
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectionReceiver(), intentFilter);
OùNetworkConnectionReceiver
est une classe étendue par BroadcastReceiver
. Ajoutez simplement cette classe dans votre application et effectuez une action dans la méthode onReceive(Context context, Intent intent)
.
Remarque: / Si vous enregistrez ce récepteur dans une Activity
, n'oubliez pas de le désenregistrer.
Pendant ce temps, ConnectivityManager.CONNECTIVITY_ACTION
était obsolète:
@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.
Donc registerDefaultNetworkCallback
devrait être utilisé:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(Network network) {
doOnNetworkConnected();
}
});