Gibt es eine einfache Möglichkeit festzustellen, ob eine bestimmte Aktivität aktiv ist oder nicht? Ich möchte bestimmte Dinge tun, je nachdem welche Aktivität aktiv ist. z.B:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
user560571
quelle
quelle
Antworten:
Sie können eine
static
Variable innerhalb der Aktivität verwenden.Das einzige Problem ist, dass, wenn Sie es in zwei Aktivitäten verwenden, die miteinander verknüpft sind,
onStop
die erste manchmalonStart
in der zweiten aufgerufen wird . Beides könnte also kurz zutreffen.Je nachdem, was Sie versuchen (aktuelle Aktivität von einem Dienst aktualisieren?). Sie können einfach einen statischen Listener im Dienst in Ihrer Aktivitätsmethode registrieren.
onStart
Dann ist der richtige Listener verfügbar, wenn Ihr Dienst die Benutzeroberfläche aktualisieren möchte.quelle
MyActivity
mitMyChildactivity
und überprüfen möchten , ob das Kind aktiv ist?Mir ist klar, dass dieses Problem ziemlich alt ist, aber ich denke, es lohnt sich immer noch, meine Lösung zu teilen, da sie für andere nützlich sein könnte.
Diese Lösung war vor der Veröffentlichung von Android Architecture Components nicht verfügbar.
Aktivität ist zumindest teilweise sichtbar
Aktivität steht im Vordergrund
quelle
Ich denke so klarer:
quelle
Eine Option ohne Verwendung einer Hilfsvariablen ist:
wo Aktivität ist zB: this oder getActivity ().
Der von diesem Ausdruck zurückgegebene Wert ändert sich in onStart () / onStop (). Hierbei handelt es sich um Ereignisse, bei denen das Layout der Aktivität auf dem Telefon gestartet / gestoppt wird.
quelle
Activity#getWindow().getDecorView().isShown()
?Ich habe die Methoden MyActivity.class und getCanonicalName verwendet und eine Antwort erhalten.
quelle
getRunningTasks()
da es veraltet ist: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…Weitaus besser als eine statische Variable zu verwenden und OOP zu folgen
Shared Preferences
kann verwendet werden, um Variablen mit anderenactivities
und Diensten von einem zu teilenapplication
Verwenden Sie gemeinsame Einstellungen. Es verfügt über die zuverlässigsten Statusinformationen, weniger Probleme beim Wechseln / Zerstören von Anwendungen, erspart uns die Anforderung einer weiteren Erlaubnis und gibt uns mehr Kontrolle darüber, wann unsere Aktivität tatsächlich die oberste ist. siehe Details bitte hier abd hier auch
quelle
onStop()
Dies ist ein Code zum Überprüfen, ob ein bestimmter Dienst ausgeführt wird. Ich bin mir ziemlich sicher, dass es auch für eine Aktivität funktionieren kann, solange Sie getRunningServices mit getRunningAppProcesses () oder getRunningTasks () ändern. Schauen Sie hier http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Ändern Sie Constants.PACKAGE und Constants.BACKGROUND_SERVICE_CLASS entsprechend
quelle
Es gibt einen viel einfacheren Weg als alles oben Genannte, und dieser Ansatz erfordert nicht die Verwendung
android.permission.GET_TASKS
im Manifest oder das Problem der Rennbedingungen oder Speicherlecks, auf das in der akzeptierten Antwort hingewiesen wird.Erstellen Sie in der Hauptaktivität eine STATIC-Variable. Mit Static können andere Aktivitäten die Daten einer anderen Aktivität empfangen.
onPause()
setzen Sie diese Variable falsch ,onResume
undonCreate()
setzen Sie diese Variable wahr .Weisen Sie Getter und Setter dieser Variablen zu.
Und dann von einer anderen Aktivität oder einem anderen Dienst
quelle
Aus den offiziellen Dokumenten:
Aktivität # isFinishing ()
Aktivität # isDestroyed ()
quelle
danke kkudi! Ich konnte Ihre Antwort an die Arbeit für eine Aktivität anpassen. Hier ist, was in meiner App funktioniert hat.
In diesem Beispiel erhalten Sie ein Richtig oder Falsch, wenn die topActivity mit dem übereinstimmt, was der Benutzer tut. Wenn also die Aktivität, nach der Sie suchen, nicht angezeigt wird (dh onPause ist), erhalten Sie keine Übereinstimmung. Dazu müssen Sie Ihrem Manifest die Berechtigung hinzufügen.
Ich hoffe das war hilfreich!
quelle
Ich denke, die akzeptierte Antwort ist eine schreckliche Art, damit umzugehen.
Ich weiß nicht, was der Anwendungsfall ist, aber bitte ziehen Sie eine geschützte Methode in der Basisklasse in Betracht
und überschreiben Sie es in der abgeleiteten Klasse.
Wenn das Ereignis eintritt, rufen Sie diese Methode einfach in der Basisklasse auf. Die richtige 'aktive' Klasse wird dann damit umgehen. Die Klasse selbst kann dann prüfen, ob dies nicht der Fall ist
Paused()
.Besser noch, verwenden Sie einen Eventbus wie den von GreenRobot , Square , aber dieser ist veraltet und schlägt die Verwendung von RxJava vor
quelle
Ich habe einen Scheck benutzt
if (!a.isFinishing())
und er scheint zu tun, was ich brauche.a
ist die Aktivitätsinstanz. Ist das falsch Warum hat das niemand versucht?quelle
wie wäre es mit
activity.isFinishing()
quelle
ActivityLifecycleCallbacks ist eine großartige Möglichkeit, alle Aktivitäten in App zu verfolgen:
ActivityState:
Erweitern Sie die Anwendungsklasse und geben Sie ihre Referenz in der Android Manifest-Datei an:
Überprüfen Sie irgendwo von Aktivität den Status einer anderen Aktivität:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
quelle
Ich bin mir nicht sicher, ob es ein "richtiger" Weg ist, "Dinge zu tun".
Wenn es keinen API-Weg gibt, um die (oder eine) Frage zu lösen, als Sie sich ein wenig überlegen sollten, machen Sie vielleicht etwas falsch und lesen stattdessen mehr Dokumente usw.
(Wie ich verstanden habe, sind statische Variablen in Android ein häufig falscher Weg. Natürlich es könnte funktionieren, aber es wird definitiv Fälle geben, in denen es nicht funktioniert (zum Beispiel in der Produktion auf Millionen Geräten).
Genau in Ihrem Fall schlage ich vor zu überlegen, warum Sie wissen müssen, ob eine andere Aktivität aktiv ist. Sie können eine andere Aktivität starten, damit das Ergebnis ihre Funktionalität erhält. Oder Sie können die Klasse ableiten, um ihre Funktionalität zu erhalten, und so weiter.
Freundliche Grüße.
quelle
Wenn Sie am Lebenszyklusstatus der spezifischen Instanz der Aktivität interessiert sind, sieht die Lösung von siliconeagle korrekt aus, außer dass die neue "aktive" Variable eine Instanzvariable und keine statische sein sollte.
quelle
Verwenden Sie eine bestellte Sendung. Siehe http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
Registrieren Sie in Ihrer Aktivität einen Empfänger in onStart und heben Sie die Registrierung in onStop auf. Wenn ein Dienst beispielsweise etwas verarbeiten muss, das die Aktivität möglicherweise besser ausführen kann, senden Sie eine bestellte Sendung vom Dienst (mit einem Standardhandler im Dienst selbst). Sie können jetzt in der Aktivität antworten, wenn sie ausgeführt wird. Der Dienst kann die Ergebnisdaten überprüfen, um festzustellen, ob die Übertragung verarbeitet wurde, und gegebenenfalls geeignete Maßnahmen ergreifen.
quelle
Wenn Sie mehrere Instanzen der Aktivität haben, können Sie zusätzlich zur akzeptierten Antwort stattdessen einen Zähler verwenden:
quelle
Hast du es versucht..
quelle
Mit dem folgenden Code wurde eine einfache Problemumgehung gefunden
quelle
Verwenden Sie die Variable isActivity, um zu überprüfen, ob die Aktivität aktiv ist oder nicht.
Dann überprüfe
quelle
Wenn Sie überprüfen möchten, ob sich die Aktivität im Backstack befindet, führen Sie einfach die nächsten Schritte aus. 1. Deklarierte eine ArrayList in Ihrer Anwendungsklasse [Die Anwendungsklasse ist in Ihrer Hauptfestdatei im Anwendungs-Tag definiert]
Fügen Sie die folgenden öffentlichen Methoden hinzu, um auf diese Liste zuzugreifen und sie zu ändern.
Überschreiben Sie in Ihrer BaseActivity, in der alle Aktivitäten sie erweitern, die Methoden onCreate und onDestroy, damit Sie Aktivitäten wie folgt zum Backstack hinzufügen und daraus entfernen können.
Wenn Sie abschließend überprüfen möchten, ob sich die Aktivität im Backstack befindet oder nicht, rufen Sie einfach diese Funktion isActivityInBackStack auf.
Beispiel: Ich möchte überprüfen, ob sich die HomeActivity im Backstack befindet oder nicht:
quelle
quelle
Dies funktioniert, wenn Sie nicht die gleiche Aktivität im Vordergrund haben. Wenn Sie von der Benachrichtigung öffnen, funktioniert nicht, habe ich einige Anpassungen vorgenommen und kam mit diesem:
Das funktioniert bei mir, wenn mehrere Aktivitäten gleichzeitig geöffnet sind.
quelle