2012-09-11 14 views
6

W mojej aplikacji aktywność A jest aktywnością wyrzutni, od A nazywa się B, a od B - C, mam więcej niż 5 działań. W C, gdy naciśnie przycisk home i ponownie otwieram moją aplikację, otwiera się C, w moim przypadku jest w porządku. Ale po naciśnięciu przycisku home w C, gdy jest on bezczynny przez jakiś czas i aplikacja zostaje zabita, po tym, kiedy otwieram moją aplikację, otwiera się C. Ale chcę tym razem otworzyć główne działanie launchera. Jak mogę to zrobić?Aplikacja nie otwiera głównej aktywności, gdy została zabita po naciśnięciu przycisku home w Androidzie

A> B> C> HOME> bezczynny przez pewien czas> aplikacja zabity> open app> C.

W tym przypadku chcę otworzyć główną działalność A zamiast C

+4

i jak można założyć, że aplikacja została zabita? Nie dzieje się tak tylko dlatego, że Twoja aplikacja nie jest używana przez jakiś czas. Jeśli zaczyna się od C, oznacza to, że nigdy nie został zabity. Aplikacja jest automatycznie zabijana przez urządzenie tylko wtedy, gdy urządzenie jest pod obciążeniem i brakuje mu pamięci. –

+1

W ddms logcat, pokazuje proces . –

+0

@MihirShah Czy znalazłeś jakieś rozwiązanie tego? – Shri

Odpowiedz

-1

Naciśnięcie przycisku Dom przełącza użytkownika z aplikacji na ekran główny, pozostawiając aplikację działającą w tle.

Tyle, że gdy telefon zaczyna brakować zasobów, takich jak pamięci to zacznie zamykać aplikacje, które są uruchomione w tle, dzięki czemu telefon ma wystarczającą ilość środków na to, co próbujemy zrobić teraz. Gry są często jedną z pierwszych aplikacji, które telefon "zabije", aby zaoszczędzić zasoby , ponieważ często używają o wiele więcej pamięci i procesora niż inne aplikacje. Dlatego czasami Twoja gra jest przerywana, a czasami Android ją zamknął.

+1

To nie odpowiada na pytanie, które zostało zadane. To powinien być komentarz, a nie odpowiedź. –

-2

po naciśnięciu przycisku home, nie zakończyłeś jeszcze działania, ale wciąż istnieje w stosie. Tylko przechodzi do pauzy, użyj tego.

jeśli dzwonisz działalność B z działalności A.and C z B

A-> B

użycie startactivityforresult od A

i ponownie B-> C

użytku startactivityforresult z B

i kiedy chcesz wyjść z C to setResult (np. RESULT_OK) i zakończyć C. i OnActivityResult() w B, sprawdź, czy esultcode == RESULT_OK następnie ponownie zakończyć B i setresult (RESULT_OK) dla procedury A.same nastąpi do końca A.

to wyjdzie ci ze stosowania application.and zacznie od A nie od C

+0

To faktycznie nie adresuje problemu, który ma OP. Jeśli Android zabije jego proces, gdy użytkownik wróci do aplikacji, będzie nadal uruchamiał nowy proces i wyświetli "C", to nie jest to, co chce OP. –

0

Możesz umieścić android:clearTaskOnLaunch="true" w swoim manifeście dla działania A, aby program uruchamiający zawsze przechodził do tej czynności.

+0

Wiem o tym, ale chcę otworzyć A tylko wtedy, gdy aplikacja zostanie zabita, nie chcę otwierać zawsze A po naciśnięciu przycisku home. –

-2

jeśli twoja aplikacja zostanie zabita przez system, nie sądzę, że zacznie się od c. Jeśli zabijasz go za pomocą aplikacji do zabijania zadań, to jest to pomyłka. Wymuś zatrzymanie go z poziomu ustawień aplikacji, a następnie sprawdź. Jeśli zostaniesz zabity przez aplikację zabójcę zadania, a następnie z C, jeśli wrócisz do punktu B, który ulega awarii, sprawdź kod wyniku. jeśli resultcode! = RESULT_OK, możesz tutaj obsłużyć swój kod i zapisać aplikację z awarii. jeśli nie rozpocząłeś działalności od wyniku, zakończ B i A przed uruchomieniem B i c.

+1

To jest złe. Jeśli Android zabije proces w tle, zapamięta stan stosu zadań i czynności, które zostały otwarte. Kiedy użytkownik powraca do tego zadania, Android tworzy nowy proces systemu operacyjnego i przywraca stan ** najwyższego "Czynności" w stosie **. W przypadku OP, utworzy nową instancję 'C', ponieważ jest to, co było najwyższym' Aktywnością' w stosie, gdy użytkownik umieścił zadanie w tle. –

5

Musisz wykryć, że Android zabił twój proces, a następnie użytkownik powrócił do aplikacji (powodując, że Android utworzył nowy proces).Opisałem jak to zrobić w licznych odpowiedziach:

https://stackoverflow.com/a/29802601/769265

https://stackoverflow.com/a/27276077/769265

https://stackoverflow.com/a/11249090/769265

+0

David, w pierwszej odpowiedzi sugerujesz zainicjować boolean w 'onCreate() pierwszego działania. Ok. Android zabija proces. Użytkownik uruchamia ponownie aplikację. Wszystkie działania, które poprzednio znajdowały się w backstacku, zostaną utworzone i ponownie umieszczone w backstackach, co oznacza, że ​​'onCreate()' z 'FirstActivity' również zostanie wywołane, co spowoduje, że wartość boolowska stanie się" true ". Tak więc za każdym razem, gdy sprawdzasz tę wartość logiczną, zawsze będzie ona "true". Czy czegoś brakuje? – azizbekian

+2

Nie, po ponownym uruchomieniu aplikacji przez użytkownika, tylko ostatnia otwarta czynność jest umieszczana na stosie (w przypadku OP C) Aktywność C) i wywoływana jest jego funkcja 'onCreate()'. Następnie użytkownik przechodzi z powrotem do B -> wywoływana jest 'onCreate()' z B i tak dalej. Użyłem rozwiązania Davida w mojej aplikacji, działa! Doskonałe rozwiązanie, dzięki! – Damnum

+2

@azizbekian Jak @Damnum mówi, kiedy Android tworzy nowy proces systemu operacyjnego, tworzy tylko najwyższy "Activity" ze stosu. Pozostałe czynności NIE są odtwarzane, dopóki użytkownik NIE WRÓCA do nich. –

0

Czy próbowali rozpoczynając wątek w onBackPressed i spać na określony czas, po którym to nazywa wykończenie() lub zatrzymać wątek (od zakończenia wywołania) i przywrócić tę samą aktywność.

Powiązane problemy