Czy istnieje prosty sposób ustalenia, czy dana czynność jest aktywna, czy nie? Chcę robić pewne rzeczy w zależności od tego, która aktywność jest aktywna. na przykład:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
user560571
źródło
źródło
Odpowiedzi:
Możesz użyć
static
zmiennej w ramach działania.Jedynym problemem jest to, że jeśli używasz go w dwóch działaniach, które są ze sobą powiązane, to
onStop
pierwsza jest czasami wywoływana poonStart
drugiej. Więc jedno i drugie może być prawdą w skrócie.W zależności od tego, co próbujesz zrobić (zaktualizować bieżącą aktywność z usługi?). Możesz po prostu zarejestrować statyczny odbiornik w usłudze w swojej
onStart
metodzie działania , a właściwy odbiornik będzie dostępny, gdy usługa będzie chciała zaktualizować interfejs użytkownika.źródło
MyActivity
sięMyChildactivity
i chcesz sprawdzić, czy dziecko jest aktywne?Zdaję sobie sprawę, że ten problem jest dość stary, ale myślę, że nadal warto podzielić się moim rozwiązaniem, ponieważ może być przydatne dla innych.
To rozwiązanie nie było dostępne przed wydaniem składników architektury systemu Android.
Aktywność jest przynajmniej częściowo widoczna
Aktywność jest na pierwszym planie
źródło
Myślę, że jest to bardziej jasne:
źródło
Opcją bez użycia żadnej zmiennej pomocniczej jest:
gdzie aktywność to np .: this lub getActivity ().
Wartość zwracana przez to wyrażenie zmienia się w onStart () / onStop (), czyli zdarzeniach, które rozpoczynają / kończą wyświetlanie układu działania na telefonie.
źródło
Activity#getWindow().getDecorView().isShown()
?Użyłem MyActivity.class i metody getCanonicalName i otrzymałem odpowiedź.
źródło
getRunningTasks()
ponieważ zostało wycofane: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/ ...O wiele lepszy sposób niż używanie zmiennej statycznej i śledzenie OOP
Shared Preferences
może być używany do współdzielenia zmiennych z innymiactivities
i usługami z jednegoapplication
Użyj wspólnych preferencji. Ma najbardziej wiarygodne informacje o stanie, mniej problemów z przełączaniem / niszczeniem aplikacji, oszczędza nam pytania o kolejne pozwolenie i daje nam większą kontrolę nad decydowaniem, kiedy nasza aktywność jest najważniejsza. zobacz szczegóły tutaj abd tutaj także
źródło
onStop()
To jest kod do sprawdzania, czy dana usługa jest uruchomiona. Jestem prawie pewien, że może to działać również dla działania, o ile zmienisz getRunningServices za pomocą getRunningAppProcesses () lub getRunningTasks (). Zajrzyj tutaj http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Zmień odpowiednio Stałe.PACKAGE i Stałe.BACKGROUND_SERVICE_CLASS
źródło
Jest o wiele łatwiejszy sposób niż wszystko powyżej, a to podejście nie wymaga użycia
android.permission.GET_TASKS
w manifeście ani nie wskazuje kwestii warunków wyścigu lub wycieków pamięci w przyjętej odpowiedzi.Utwórz zmienną STATIC w głównym działaniu. Static umożliwia innym działaniom otrzymywanie danych z innego działania.
onPause()
ustawić tę zmienną false ,onResume
aonCreate()
ustawiona zmienna ta prawdziwa .Przypisz metody pobierające i ustawiające dla tej zmiennej.
A potem z innej działalności lub Usługi
źródło
Z oficjalnych dokumentów:
Aktywność # isFinishing ()
Aktywność # isDestroyed ()
źródło
dzięki kkudi! Udało mi się dostosować Twoją odpowiedź do pracy w zadaniu… oto, co zadziałało w mojej aplikacji…
ten przykład da ci wartość true lub false, jeśli topActivity pasuje do tego, co robi użytkownik. Więc jeśli aktywność, którą sprawdzasz, nie jest wyświetlana (tj. Jest onPause), nie otrzymasz dopasowania. Aby to zrobić, musisz dodać uprawnienie do swojego manifestu.
Mam nadzieję, że to było pomocne!
źródło
Myślę, że zaakceptowana odpowiedź jest okropnym sposobem radzenia sobie z tym.
Nie wiem, jaki jest przypadek użycia, ale proszę rozważyć metodę chronioną w klasie bazowej
i nadpisz go w klasie pochodnej.
Gdy wystąpi zdarzenie, po prostu wywołaj tę metodę w klasie bazowej. Wtedy poradzi sobie z tym właściwa „aktywna” klasa. Klasa sama może wtedy sprawdzić, czy tak nie jest
Paused()
.Jeszcze lepiej, użyj magistrali zdarzeń, takiej jak GreenRobot , Square , ale ta jest przestarzała i sugeruje użycie RxJava
źródło
Użyłem czeku
if (!a.isFinishing())
i wydaje mi się, że robi to, czego potrzebuję.a
jest instancją działania. Czy to jest niepoprawne? Dlaczego nikt tego nie próbował?źródło
co powiesz na
activity.isFinishing()
źródło
ActivityLifecycleCallbacks to świetny sposób na śledzenie wszystkich działań w aplikacji:
Stan aktywności:
Rozszerz klasę Application i podaj jej odwołanie w pliku manifestu systemu Android:
Sprawdź gdziekolwiek z Aktywności, aby sprawdzić status innej aktywności
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
źródło
Nie jestem pewien, czy jest to „właściwy” sposób „robienia rzeczy”.
Jeśli nie ma sposobu API, aby rozwiązać (lub a) pytanie, niż powinieneś pomyśleć, być może robisz coś źle i zamiast tego czytasz więcej dokumentów itp.
(Jak rozumiem, zmienne statyczne są często niewłaściwym sposobem w Androidzie. Przyczyna mógłby działać, ale na pewno będą przypadki, kiedy nie zadziała [na przykład w produkcji, na milionach urządzeń]).
Dokładnie w twoim przypadku proponuję zastanowić się, dlaczego musisz wiedzieć, czy inna aktywność jest aktywna? .. możesz rozpocząć inną aktywność, aby uzyskać wynik, aby uzyskać jej funkcjonalność. Lub możesz wyprowadzić klasę, aby uzyskać jej funkcjonalność i tak dalej.
Z poważaniem.
źródło
Jeśli interesuje Cię stan cyklu życia konkretnej instancji działania, rozwiązanie Siliconeagle wygląda poprawnie, z tym wyjątkiem, że nowa zmienna „aktywna” powinna być zmienną instancji, a nie statyczną.
źródło
Użyj zamówionej transmisji. Zobacz http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
W swojej działalności zarejestruj odbiorcę w onStart, wyrejestruj się z onStop. Teraz, gdy na przykład usługa musi obsłużyć coś, co mogłoby być w stanie zrobić lepiej, wyślij z usługi zamówioną transmisję (z domyślną obsługą w samej usłudze). Możesz teraz odpowiedzieć w działaniu, gdy jest ono uruchomione. Usługa może sprawdzić dane wyników, aby sprawdzić, czy transmisja została obsłużona, a jeśli nie, podjąć odpowiednie działania.
źródło
Oprócz zaakceptowanej odpowiedzi , jeśli masz wiele wystąpień działania, możesz zamiast tego użyć licznika:
źródło
Czy próbowałeś..
źródło
Znalazłem łatwe obejście tego kodu
źródło
Użyj zmiennej isActivity, aby sprawdzić, czy aktywność jest aktywna, czy nie.
Następnie sprawdź
źródło
Jeśli chcesz sprawdzić, czy aktywność znajduje się na tylnym stosie, wykonaj kolejne kroki. 1. Zadeklarowano ArrayList w klasie aplikacji [klasa aplikacji jest zdefiniowana w pliku mainfest w tagu aplikacji]
Dodaj następujące metody publiczne, aby uzyskać dostęp do tej listy i zmodyfikować ją.
W Twoim BaseActivity, gdzie wszystkie działania go rozszerzają, zastąp metody onCreate i onDestroy, aby można było dodawać i usuwać działania z zaplecza w następujący sposób.
Na koniec, jeśli chcesz sprawdzić, czy aktywność jest na tylnym stosie, czy nie, po prostu wywołaj tę funkcję isActivityInBackStack.
Np .: chcę sprawdzić, czy HomeActivity znajduje się na tylnym stosie, czy nie:
źródło
źródło
To działa, jeśli nie masz tej samej aktywności na pierwszym planie. Jeśli otworzysz z powiadomienia nie działa, wprowadziłem pewne poprawki i przyszedłem z tym:
U mnie to działa, gdy jednocześnie jest otwartych kilka działań.
źródło