380 Stimmen

Prüfen, ob eine Android-Anwendung im Hintergrund läuft

Mit Hintergrund meine ich, dass keine der Aktivitäten der Anwendung derzeit für den Benutzer sichtbar sind?

1voto

Key Punkte 6856

Ich empfehle, diese Seite durchzulesen: http://developer.Android.com/reference/Android/app/Activity.html

Kurz gesagt, Ihre Aktivität ist nicht mehr sichtbar, nachdem onStop() aufgerufen wurde.

1voto

Rachit Mishra Punkte 6031

Da es noch nicht erwähnt wurde, schlage ich den Lesern vor, Folgendes zu erkunden ProcessLifecycleOwner erhältlich über Komponenten der Android-Architektur

1voto

konmik Punkte 2950

Die Aktivität wird pausiert, wenn ein Dialog darüber erscheint, so dass alle empfohlenen Lösungen nur halbe Lösungen sind. Sie müssen auch für Dialoge Hooks erstellen.

0voto

Marko Pacak Punkte 3581

Meiner Meinung nach führen viele Antworten eine große Menge an Code ein und bringen eine Menge Komplexität und Unlesbarkeit mit sich.

Wenn Menschen in SO fragen, wie sie zwischen einem Service y un Activity rate ich in der Regel zur Verwendung der LocalBroadcastManager .


Warum?

Nun, indem ich die Dokumente zitiere:

  • Sie wissen, dass die Daten, die Sie übertragen, Ihre App nicht verlassen, und müssen sich keine Sorgen machen, dass private Daten nach außen dringen.

  • Es ist nicht möglich, dass andere Anwendungen diese Übertragungen an Ihre Anwendung senden, so dass Sie sich keine Sorgen machen müssen, dass sie Sicherheitslücken ausnutzen können.

  • Dies ist effizienter als das Senden eines globalen Rundrufs durch das System.

Das steht nicht in den Unterlagen:

  • Es benötigt keine externen Bibliotheken
  • Der Code ist minimal
  • Es ist schnell zu implementieren und zu verstehen
  • Keine benutzerdefinierten selbst-implementierten Rückrufe / Ultra-Singleton / Intra-Prozess Muster, was auch immer...
  • Keine starken Referenzen en Activity , Application , ...

Beschreibung

Sie möchten also überprüfen, ob eine der Activity steht derzeit im Vordergrund. Normalerweise tun Sie das in einer Service oder Ihr Application Klasse.

Dies bedeutet, dass Ihr Activity Objekte werden zum Absender eines Signals (ich bin an / ich bin aus). Ihr Service wird hingegen zum Receiver .

Es gibt zwei Momente, in denen Ihr Activity sagt Ihnen, ob es in den Vordergrund oder in den Hintergrund geht (ja, nur zwei... nicht 6).

Wenn die Activity in den Vordergrund tritt, wird die onResume() Methode ausgelöst wird (auch aufgerufen nach onCreate() ).

Wenn die Activity geht nach hinten, onPause() genannt wird.

Dies sind die Momente, in denen Ihr Activity sollte das Signal an Ihre Service um seinen Zustand zu beschreiben.

Im Falle von mehreren Activity erinnern Sie sich an den an Activity geht zuerst in den Hintergrund, dann kommt ein anderer in den Vordergrund.

Die Situation wäre also wie folgt:*

Activity1 -- send --> Signal:OFF
Activity2 -- send --> Signal:ON

En Service / Application wird einfach weiter auf diese Signale achten und entsprechend handeln.


Code (TLDR)

Ihr Service muss eine BroadcastReceiver um nach Signalen zu lauschen.

this.localBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // received data if Activity is on / off
    }
}

public static final IntentFilter SIGNAL_FILTER = new IntentFilter("com.you.yourapp.MY_SIGNAL") 

Registrieren Sie die Receiver en Service::onCreate()

@Override
protected void onCreate() {
    LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, SIGNAL_FILTER);
}

Deregistrieren Sie es in Service::onDestroy()

@Override
protected void onDestroy() {
    // I'm dead, no need to listen to anything anymore.
    LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver);
}

Jetzt ist Ihr Activity müssen ihren Zustand mitteilen.

En Activity::onResume()

Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER); // put ON boolean in intent    
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

En Activity::onPause()

Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER); // put OFF boolean in intent    
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

Eine sehr, sehr häufige Situation

Entwickler: Ich möchte Daten von meinem Service und aktualisieren Sie die Activity . Wie prüfe ich, ob die Activity im Vordergrund steht?

In der Regel ist es nicht notwendig zu prüfen, ob die Activity im Vordergrund steht oder nicht. Senden Sie die Daten einfach über LocalBroadcastManager von Ihrem Service . Wenn die Activity eingeschaltet ist, dann wird es reagieren und handeln.

Für diese sehr häufige Situation ist die Service wird der Absender, und die Activity implementiert die BroadcastReceiver .

Also, erstellen Sie eine Receiver in Ihrem Activity . Registrieren Sie es in onResume() und heben Sie die Registrierung in onPause() . Es besteht keine Notwendigkeit, die anderen Lebenszyklusmethoden anzuwenden .

Definieren Sie die Receiver Verhalten in onReceive() (ListView aktualisieren, dies tun, das tun, ...).

Auf diese Weise wird die Activity hört nur zu, wenn es im Vordergrund ist, und es passiert nichts, wenn es im Hintergrund ist oder zerstört wird.

Im Falle von mehreren Activity je nach dem Activity eingeschaltet ist, antworten (wenn sie auch die Receiver ).

Wenn alle im Hintergrund sind, antwortet niemand und das Signal geht einfach verloren.

Senden Sie die Daten aus dem Service vía Intent (siehe Code oben) durch Angabe der Signal-ID.


0voto

ayoub laaziz Punkte 988
fun isAppInForeground(): Boolean {
    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager ?: return false

    val appProcesses = activityManager.runningAppProcesses ?: return false

    val packageName = packageName
    for (appProcess in appProcesses) {
        if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName == packageName) {
            return true
        }
    }

    return false
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X