Android:So überprüfen Sie, ob die Anwendung in den Hintergrund geschaltet wurde, um unnötige BroadcastReceiver-Prüfungen zu vermeiden

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

Frage

Die Frage ist einfach einfach:

Erläuterung:

Was ich mache, ist, einen BroadcastReceiver zu haben, der jedes Mal aufgerufen wird, wenn sich der GPS-Status ändert (aktiviert oder deaktiviert) und den Benutzer benachrichtigt, wenn das GPS deaktiviert wurde, und ihn auffordert, es erneut zu aktivieren (wodurch die entsprechende Absicht gestartet wird).

Ich aktiviere (und deaktiviere) es schließlich in der Stammaktivität meiner App, sodass es für jede untergeordnete Aktivität aufgerufen wird.

Mein Problem tritt auf, wenn der Benutzer beispielsweise die HOME-Taste drückt oder eine andere App öffnet und das GPS deaktiviert. Die Benachrichtigung erscheint weiterhin und bringt meine App in den Vordergrund.

Der Code

Rundfunkempfänger

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);
        }
    }
}

Aktivieren/deaktivieren Sie die Empfängerprüfung bei onCreate und onDestroy der Root-Aktivität

@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();
}

Primäre Bedürfnisse

Ich müsste den BroadcastReceiver-Aufruf deaktivieren, wenn die Anwendung in den Hintergrund geht, und ihn aktivieren, wenn die App wieder in den Vordergrund tritt

Was wäre das Beste

Befolgen Sie die oben genannten Anforderungen:

Wenn der Benutzer das GPS deaktiviert, während die App im Hintergrund läuft (auf diese Weise sollte er keine Benachrichtigung erhalten), fange ich sie ab, wenn er die App wieder in den Vordergrund bringt, überprüfe manuell den GPS-Status und benachrichtige sie schließlich Der Benutzer muss das GPS aktivieren.

War es hilfreich?

Lösung

Dies ist einer der Gründe, warum Fragmente nützlich sind.Wenn du eine hast Activity Verwaltung mehrerer Fragmente, die onPause() Und onResume() Dieser Vorgang erledigt das Registrieren und Abmelden dieses Empfängers problemlos, ohne die Komplikationen untergeordneter Aktivitäten.

Sofern dies nicht der Fall ist, würde ich empfehlen, die Aktivität in eine „GpsReceiverActivity“ zu unterklassifizieren, die dortige Registrierung und Aufhebung der Registrierung des Empfängers zu verwalten und diese als Basisklasse für alle anderen Aktivitäten zu verwenden, von denen Sie die Sendung empfangen möchten.

Gut geschriebene Frage übrigens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top