Zawsze, gdy moja transmisja jest wykonywana, chcę pokazać alert o działaniach na pierwszym planie.
android
android-activity
Deepali
źródło
źródło
Odpowiedzi:
Wiedząc, że ActivityManager zarządza Aktywnością , możemy uzyskać informacje z ActivityManager . Aktualną działającą aktywność na pierwszym planie otrzymujemy wg
UPDATE 2018/10/03
getRunningTasks () jest WYCOFANE. zobacz poniższe rozwiązania.
Ta metoda została wycofana na poziomie API 21. Począwszy od Build.VERSION_CODES.LOLLIPOP, ta metoda nie jest już dostępna dla aplikacji innych firm: wprowadzenie ostatnich zorientowanych na dokumenty oznacza, że może ona wyciekać informacje o osobie do wywołującego. W celu zapewnienia kompatybilności wstecznej nadal zwróci niewielki podzbiór swoich danych: przynajmniej własne zadania wywołującego i prawdopodobnie inne zadania, takie jak dom, o których wiadomo, że nie są wrażliwe.
źródło
( Uwaga: oficjalny interfejs API został dodany do API 14: Zobacz tę odpowiedź https://stackoverflow.com/a/29786451/119733 )
NIE UŻYWAJ POPRZEDNIEJ (waqas716) odpowiedzi.
Będziesz miał problem z wyciekiem pamięci z powodu statycznego odniesienia do działania. Aby uzyskać więcej informacji, zobacz poniższy link http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html
Aby tego uniknąć, należy zarządzać odniesieniami do działań. Dodaj nazwę aplikacji w pliku manifestu:
Twoja klasa aplikacji:
Utwórz nowe działanie:
Tak więc zamiast rozszerzać klasę Activity dla swoich działań, po prostu rozszerz MyBaseActivity. Teraz możesz pobrać swoją bieżącą aktywność z aplikacji lub kontekstu działania w następujący sposób:
źródło
WeakReferences
w Androidzie, GC zbiera je szybciej niż myślisz.WeakReference
nie jest zalecane do buforowania, to nie jest buforowanie, to znaczymCurrentActivity
będzie mieć do niego odniesienie tylko wtedy, gdy jest żywy, więcWeakReference
nigdy nie zostaną zebrane, gdyActivity
jest na wierzchu. Jednak to, co sugeruje @NachoColoma, jest błędne, ponieważWeakReference
może nadal odnosić się do nie wznowionej (nie aktywnej / nie na wierzchu) aktywności, jeśli zmienna nie zostanie wyczyszczona!Application .ActivityLifecycleCallbacks
, które byłoby bardziej centralne i nie musiałbyś dodawać żadnego kodu zarządzającego do wszystkich swoich działań. Zobacz także developer.android.com/reference/android/app/…Rozszerzam odpowiedź @ gezdy.
W każdym działaniu, zamiast „rejestrować się” za
Application
pomocą ręcznego kodowania, możemy skorzystać z następującego interfejsu API od poziomu 14, aby pomóc nam osiągnąć podobny cel przy mniejszym ręcznym kodowaniu.http://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks%28android.app.Application.ActivityLifecycleCallbacks%29
W programie
Application.ActivityLifecycleCallbacks
można uzyskać informacje o tym, coActivity
jest „dołączone” lub „odłączone” od tegoApplication
.Jednak ta technika jest dostępna tylko od poziomu API 14.
źródło
implements Application.ActivityLifecycleCallbacks
i dodajesz metody do zaimplementowania tego. Następnie w konstruktorze tej klasy (lub onCreate, init lub innej metodzie, która działa, gdy instancja staje się aktywna / gotowa), umieśćgetApplication().registerActivityLifecycleCallbacks(this);
jako ostatnią linię.Aktualizacja 2 : W tym celu dodano oficjalny interfejs API, zamiast tego użyj ActivityLifecycleCallbacks .
AKTUALIZACJA:
Jak wskazał @gezdy i jestem za to wdzięczny. ustaw odniesienie na null również dla bieżącego działania, zamiast aktualizować tylko przy każdym onResume, ustaw go na null w przypadku onDestroy każdego działania, aby uniknąć problemu z wyciekiem pamięci.
Jakiś czas temu potrzebowałem tej samej funkcjonalności i oto metoda, jak to osiągnąłem. W każdej swojej działalności zastąp te metody cyklu życia.
Teraz w swojej klasie transmisji możesz uzyskać dostęp do bieżącej aktywności, aby pokazać jej alert.
źródło
Application
jest tworzony tylko raz i nigdy nie zbiera śmieci, dokładnie tak jak zmienna statyczna.clearReferences()
do(this.equals(currActivity))
.@lockwobr Dzięki za aktualizację
Dostęp do prądu
Activity
jest bardzo wygodny. Czy nie byłoby miło mieć statycznągetActivity
metodę zwracającą bieżącą aktywność bez zbędnych pytań?Activity
Klasa jest bardzo przydatna. Daje dostęp do wątku interfejsu użytkownika aplikacji, widoków, zasobów i wielu innych. Liczne metody wymagająContext
, ale jak uzyskać wskaźnik? Oto kilka sposobów:ActivityThread
. Ta klasa ma dostęp do wszystkich działań i, co jeszcze lepsze, ma statyczną metodę pobierania prąduActivityThread
. Jest tylko jeden mały problem - lista aktywności ma dostęp do pakietu.Łatwe do rozwiązania za pomocą refleksji:
Takiej metody można używać w dowolnym miejscu aplikacji i jest ona znacznie wygodniejsza niż wszystkie wymienione podejścia. Co więcej, wydaje się, że nie jest to tak niebezpieczne, jak się wydaje. Nie wprowadza żadnych nowych potencjalnych wycieków ani zerowych wskaźników.
Powyższy fragment kodu nie obsługuje wyjątków i naiwnie zakłada, że pierwsze uruchomione działanie jest tym, którego szukamy. Możesz chcieć dodać dodatkowe kontrole.
Post na blogu
źródło
Map
zamiast tego używać interfejsuHashMap
lubArrayMap
. Edytowałem odpowiedź @AZ_.Zrobiłem następujące w Kotlinie
Edytuj klasę aplikacji w następujący sposób
Utwórz klasę ActivityLifecycleCallbacks
możesz teraz używać go w dowolnej klasie, wywołując następujące polecenie:
FTApplication.currentActivity()
źródło
getCurrentActivity () również znajduje się w ReactContextBaseJavaModule.
(Ponieważ to pytanie zostało zadane na początku, wiele aplikacji na Androida ma również komponent ReactNative - aplikację hybrydową).
klasa ReactContext w ReactNative ma cały zestaw logiki do obsługi mCurrentActivity, który jest zwracany w getCurrentActivity ().
Uwaga: Chciałbym, żeby metoda getCurrentActivity () została zaimplementowana w klasie aplikacji na Androida.
źródło
Nie mogłem znaleźć rozwiązania, z którego nasz zespół byłby zadowolony, więc stworzyliśmy własne. Używamy
ActivityLifecycleCallbacks
do śledzenia bieżącej aktywności, a następnie ujawniamy ją za pośrednictwem usługi. Więcej szczegółów tutaj: https://stackoverflow.com/a/38650587/10793źródło
Aby uzyskać zgodność wsteczną:
źródło
WeakReference
uchwyt zApplication
klasy - podczas gdyComponentName
wymagane jest określenie, czy żądaneActivity
znajduje się na górze listy uruchomionych zadań. A jeśli to nie w pełni odpowiada na pytanie, przyjęta odpowiedź też nie.topActivity
jest dostępny tylko z Androida QOsobiście zrobiłem tak, jak powiedział „Cheok Yan Cheng”, ale użyłem „Listy”, aby mieć „backstack” do wszystkich moich działań.
Utwórz aplikację, która rozszerza „Aplikacja” i wykonaj następujące czynności:
W moim przypadku użyłem „Application.ActivityLifecycleCallbacks” do:
Bind / Unbind Merlin Instance (służy do uzyskiwania zdarzenia, gdy aplikacja utraci lub uzyska połączenie, na przykład gdy zamkniesz mobilną transmisję danych lub gdy ją otworzysz). Jest to przydatne po wyłączeniu akcji intencji „OnConnectivityChanged”. Więcej informacji o MERLINIE znajdziesz na: MERLIN INFO LINK
Zamknij moją ostatnią instancję Realm po zamknięciu aplikacji; Zainicjuję to wewnątrz BaseActivity, które jest rozszerzone ze wszystkich innych działań i które ma prywatną instancję RealmHelper. Aby uzyskać więcej informacji o REALM, zobacz: REALM INFO LINK Na przykład mam statyczną instancję "RealmHelper" wewnątrz mojej klasy "RealmHelper", która jest tworzona w mojej aplikacji "onCreate". Mam usługę synchronizacji, w której tworzę nowy „RealmHelper”, ponieważ Realm jest „powiązany z wątkami”, a instancja dziedziny nie może działać w innym wątku. Aby więc postępować zgodnie z dokumentacją dziedziny „Musisz zamknąć wszystkie otwarte instancje dziedziny, aby uniknąć wycieków zasobów systemowych”, aby to osiągnąć, użyłem „Application.ActivityLifecycleCallbacks”, jak widać powyżej.
Wreszcie mam odbiornik, który jest wyzwalany po zakończeniu synchronizacji aplikacji, a po zakończeniu synchronizacji wywoła metodę „IEndSyncCallback” „onEndSync”, w której sprawdzam, czy mam określoną klasę aktywności na mojej liście ActivitiesBackStack, ponieważ potrzebuję aby zaktualizować dane w widoku, jeśli synchronizacja je zaktualizowała i może być konieczne wykonanie innych operacji po synchronizacji aplikacji.
To wszystko, mam nadzieję, że to pomoże. Widzę cię :)
źródło
Odpowiedź waqas716 jest dobra. Stworzyłem obejście dla konkretnego przypadku wymagające mniejszej ilości kodu i mniejszej obsługi.
Znalazłem specyficzne obejście, ponieważ metoda statyczna pobiera widok z działania, które podejrzewam, że znajduje się na pierwszym planie. Możesz iterować wszystkie działania i sprawdzić, czy chcesz, lub uzyskać nazwę działania z odpowiedzi Martina
Następnie sprawdzam, czy widok nie jest pusty i pobieram kontekst za pomocą metody getContext ().
źródło
getRunningTasks
:"Note: this method is only intended for debugging and presenting task management user interfaces. This should never be used for core logic in an application, ..."
w developer.android.com/reference/android/app/ ...Nie podoba mi się żadna inna odpowiedź. Menedżer aktywności nie jest przeznaczony do pobierania bieżącej aktywności. Super klasyfikacja i zależność od onDestroy jest również delikatna i nie jest najlepszym projektem.
Szczerze mówiąc, najlepsze, co do tej pory wymyśliłem, to po prostu utrzymanie wyliczenia w mojej aplikacji, które jest ustawiane podczas tworzenia działania.
Innym zaleceniem może być unikanie wykonywania wielu czynności, jeśli to możliwe. Można to zrobić za pomocą fragmentów lub według moich preferencji widoków niestandardowych.
źródło
Dość prostym rozwiązaniem jest utworzenie pojedynczej klasy menedżera, w której można przechowywać odniesienie do jednego lub więcej działań lub czegokolwiek innego, do czego chcesz mieć dostęp w całej aplikacji.
Połączenie
UberManager.getInstance().setMainActivity( activity );
do funkcji onCreate głównej aktywności.Zadzwoń do
UberManager.getInstance().getMainActivity();
dowolnego miejsca w aplikacji, aby ją odzyskać. (Używam tego, aby móc używać Toast z wątku innego niż interfejs użytkownika).Upewnij się, że dodajesz wywołanie,
UberManager.getInstance().cleanup();
gdy Twoja aplikacja jest niszczona.źródło
Spóźniłem się jakieś 3 lata, ale i tak odpowiem na wypadek, gdyby ktoś znalazł to tak, jak ja.
Rozwiązałem to, po prostu używając tego:
Zwróć uwagę, że „getIntent (). ToString ()” zawiera kilka innych tekstów, takich jak nazwa pakietu i wszelkie filtry intencji dla Twojej aktywności. Technicznie rzecz biorąc, sprawdzamy obecny zamiar, a nie aktywność, ale wynik jest taki sam. Po prostu użyj np. Log.d ("test", getIntent (). ToString ()); jeśli chcesz zobaczyć cały tekst. To rozwiązanie jest trochę hackerskie, ale jest znacznie czystsze w kodzie, a funkcjonalność jest taka sama.
źródło