2 votes

Manière appropriée de réessayer la communication réseau

Je suis en train de construire une application qui récupère périodiquement des données d'un site web en utilisant une alarme récurrente et un IntentService. Avant d'exécuter la mise à jour, je vérifie la connectivité réseau avec un ConnectivityManager.

Si le ConnectivityManager signale qu'il n'y a pas de réseau actif, je souhaite réessayer la mise à jour lorsque le réseau devient actif. Utiliser un BroadcastReceiver qui écoute l'action ConnectivityManager.CONNECTIVITY_ACTION semble être la meilleure façon de procéder, mais quel serait le moyen approprié d'enregistrer/désenregistrer ce receveur?

Je pense que lorsque la vérification du réseau échoue dans l'IntentService, je pourrais enregistrer le BroadcastReceiver avec le ApplicationContext afin qu'il ne soit pas désenregistré lorsque le service s'arrête. Pourrais-je ensuite désenregistrer le receveur dans sa propre méthode onReceive lorsqu'il se déclenche? Suis-je complètement à côté de la plaque?

Quelques exemples de pseudo code:

MyIntentService:

if (!isNetworkConnected())
    getApplicationContext().registerReceiver(new MyBroadcastReceiver(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

MyBroadcastReceiver:

public void onReceive(Context context, Intent intent) {
    context.getApplicationContext().unregisterReceiver(this);

1voto

Ralgha Points 5061

Je crois avoir trouvé la solution à mon problème. Enregistrer le récepteur avec le ApplicationContext ne fonctionnera pas car il sera désenregistré lorsque le processus de l'application est terminé.

Je pense que la manière appropriée de gérer cela est de déclarer le récepteur dans le Manifeste, puis d'utiliser PackageManager.setComponentEnabledSetting pour activer/désactiver le récepteur selon les besoins (à la place de mes deux exemples ci-dessus).

Donc, je le registre dans le Manifeste comme désactivé (enabled=false), puis je fais ce qui suit:

MyIntentService:

protected void onHandleIntent( Intent intent ) {
    if ( !isNetworkConnected() )
        getPackageManager().setComponentEnabledSetting(
            new ComponentName( this, MyBroadcastReceiver.class ),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP );

MyBroadcastReceiver:

public void onReceive( Context context, Intent intent ) {
    getPackageManager().setComponentEnabledSetting(
        new ComponentName( this, MyBroadcastReceiver.class ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X