Android:Comment vérifier que l'application a été mise en arrière-plan pour éviter les vérifications BroadcastReceiver inutiles

StackOverflow https://stackoverflow.com//questions/22036634

Question

La question est tout simplement simple :

Explication:

Ce que je fais, c'est avoir un BroadcastReceiver qui est appelé à chaque fois que l'état du GPS change (activer ou désactiver) et informe l'utilisateur si le GPS a été désactivé, l'invitant à le réactiver (en lançant l'intention relative).

Je l'active (et éventuellement le désactive) dans l'activité racine de mon application, de cette façon, elle sera appelée pour chaque activité enfant.

Mon problème survient lorsque l'utilisateur appuie sur le bouton HOME (par exemple) ou ouvre une autre application et désactive le GPS. La notification apparaît toujours, mettant mon application au premier plan.

Le code

Récepteur de diffusion

public class GPSStatusReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (!provider.contains(LocationManager.GPS_PROVIDER)) {
            Intent gpsIntent = new Intent(context, GPSDialogActivity.class);
            gpsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_TITLE, "Attivazione GPS");
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_MESSAGE, "E' necessario abilitare il GPS. Cliccare su 'Usa satelliti GPS'.");
            context.startActivity(gpsIntent);
        }
    }
}

Activer/Désactiver la vérification du récepteur sur onCreate et onDestroy de l'activité racine

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    *
    *
    Stuff
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

@Override
protected void onDestroy() {

    *
    *
    Stuff
    *
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    super.onDestroy();
}

Besoins primaires

Ce dont j'aurais besoin, c'est de désactiver l'appel de BroadcastReceiver lorsque l'application passe en arrière-plan et de l'activer lorsque l'application revient au premier plan.

Quel serait le meilleur

Suite aux besoins ci-dessus :

si l'utilisateur désactive le GPS lorsque l'application est en arrière-plan (de cette façon, il ne devrait avoir aucune notification), lorsqu'il ramènera l'application au premier plan, je l'intercepte et fais une vérification manuelle de l'état du GPS et j'en informe éventuellement à l'utilisateur d'activer le GPS.

Était-ce utile?

La solution

C’est l’une des raisons pour lesquelles les fragments sont utiles.Si vous en avez un Activity gérer plusieurs fragments, le onPause() et onResume() de cette activité gérera correctement l'enregistrement et la désinscription de ce récepteur, sans la complication des activités des enfants.

À part cela, je recommanderais de sous-classer Activity dans un "GpsReceiverActivity", en gérant l'enregistrement et la désinscription du récepteur et en l'utilisant comme classe de base de toutes les autres activités par lesquelles vous souhaitez que la diffusion soit reçue.

Question bien écrite, d'ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top