web-dev-qa-db-fra.com

Android N ne pas envoyer de diffusion Android.net.conn.CONNECTIVITY_CHANGE?

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é?

15
DanMD

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

21
Kalpesh Patel

Utilisez ce code pour inscrire le destinataire dans votre classe Activity ou Application

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

NetworkConnectionReceiverest 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.

23
Ambar Jain

Pendant ce temps, ConnectivityManager.CONNECTIVITY_ACTI‌​ON é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();
    }
});
0
eleven