web-dev-qa-db-fra.com

CONNECTIVITY_CHANGE déconseillé dans la cible d'Android N

Je reçois un avertissement concernant la déclaration obsolète de Broadcast Receiver.

<!-- NETWORK RECEIVER... -->
<receiver Android:name=".utils.NetworkUtils" >
    <intent-filter>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

ATTENTION:

Déclarer un broadcastreceiver pour Android.net.conn.CONNECTIVITY_CHANGE est déconseillé pour les applications ciblant N et plus. En général, les applications devraient ne comptez pas sur cette diffusion et utilisez plutôt JobScheduler ou GCMNetworkManager.

Y a-t-il un autre moyen de l'utiliser sans méthodes obsolètes?

12
Pratik Butani

J'ai eu le même problème, j'ai fait quelque chose comme ça. Cela a fonctionné pour moi, j'espère que cela aide.

public class NewActivity extends AppCompatActivity {
    final static String CONNECTIVITY_ACTION = "Android.net.conn.CONNECTIVITY_CHANGE";
    IntentFilter intentFilter;
    MyReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);

        intentFilter = new IntentFilter();
        intentFilter.addAction(CONNECTIVITY_ACTION);
        receiver = new MyReceiver();

        if(checkForInternet()){
            loadData();
        }else{
            updateUI();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

    // Self explanatory method
    public boolean checkForInternet() {
        ConnectivityManager cm =
                (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null &&
                activeNetwork.isConnectedOrConnecting();
    }

    void loadData(){
        // do sth
    }

    void updateUI(){
        // No internet connection, update the ui and warn the user
    }


    private class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            String actionOfIntent = intent.getAction();
            boolean isConnected = checkForInternet();
            if(actionOfIntent.equals(CONNECTIVITY_ACTION)){
                if(isConnected){
                    loadData();
                }else{
                    updateUI();
                }
            }
        }
    }
}

N'ajoutez pas le récepteur dans le manifeste pour qu'il ne vive que dans cette activité.

10
Tahir Ferli

L’avis officiel de Google est de passer à JobScheduler. Étant donné que celui-ci est disponible uniquement à partir de l'API de niveau 21 et supérieur, il est interdit aux appareils plus anciens.

Heureusement, les gens d'Evernote créent une version de compatibilité ascendante de cela: https://github.com/evernote/Android-job

1
Dmitry Zaytsev

L'avertissement semble contenir l'indice que vous devez utiliser le planificateur de travaux. L'intention ici est que les applications ne communiquent pas les intentions au système en ce qui concerne les actions qu'elles souhaitent effectuer lorsque l'application reçoit la connectivité. Le planificateur de tâches évite évidemment ces problèmes et permet à Android de regrouper les demandes, de les différer, etc.

La mise en garde est que vous devrez mettre en œuvre le travail dans les deux sens puisque le planificateur de tâches est uniquement disponible depuis Android 5.0. Vous pouvez peut-être utiliser les bibliothèques qui passeront à l'implémentation native du planificateur de travaux, une autre réponse en a cité une.

0
Malcolm

En fait, le moyen le plus simple et à droite pour résoudre ce problème consiste à enregistrer le destinataire dans votre activité principale et à supprimer le code <receiver/> de votre fichier Manifest.

S'inscrire à l'activité principale:

IntentFilter intentFilter = new IntentFilter("Android.net.conn.CONNECTIVITY_CHANGE");
this.registerReceiver(new YourConnectionReceiverClass(), intentFilter);
0
AverageMoss1123