Mam nadzieję, że ktoś może mi pomóc znaleźć, jeśli nie rozwiązanie, przynajmniej wyjaśnienie zachowania.
Problem:
Na niektórych urządzeniach naciśnięcie ikony programu uruchamiającego powoduje wznowienie bieżącego zadania, na innych skutkuje uruchomieniem celu początkowego uruchomienia (skuteczne ponowne uruchomienie aplikacji). Dlaczego to się dzieje?
Szczegół:
Gdy naciśniesz „ikonę uruchamiania”, aplikacja uruchomi się normalnie - to znaczy, zakładam, że intencja jest uruchamiana z nazwą twojego pierwszego Activity
z akcją android.intent.action.MAIN
i kategorią android.intent.category.LAUNCHER
. Nie zawsze tak jednak jest:
Na większości urządzeń, jeśli naciśniesz ikonę programu uruchamiającego po uruchomieniu aplikacji, aktualnie uruchomiona aktywność w tym procesie zostanie wznowiona ( NIE początkowa Activity
). Wznawia się tak samo, jakbyś wybrał go z „Ostatnie zadania” w menu OS. Takie zachowanie chcę na wszystkich urządzeniach.
Jednak na wybranych innych urządzeniach występuje inne zachowanie:
W telefonie Motorola Xoom po naciśnięciu ikony programu uruchamiającego aplikacja zawsze rozpocznie pierwsze uruchomienie
Activity
bez względu na to, co jest aktualnie uruchomione. Zakładam, że ikony programu uruchamiającego zawsze rozpoczynają zamiar „LAUNCHER”.Na Samsung Tab 2, po naciśnięciu ikony uruchamiania, jeśli właśnie zainstalowałeś aplikację, zawsze uruchomi ona początkową
Activity
(Taki sam jak Xoom) - jednak po ponownym uruchomieniu urządzenia po instalacji ikona uruchamiania zostanie zamiast tego wznowić aplikację. Zakładam, że te urządzenia dodają „zainstalowane aplikacje” do tabeli odnośników podczas uruchamiania urządzenia, które pozwalają ikonom programu uruchamiającego poprawnie wznowić uruchomione zadania?
Czytałem wiele odpowiedzi, że dźwięk podobny do mojego problemu, ale po prostu dodając android:alwaysRetainTaskState="true"
lub używając launchMode="singleTop"
do Activity
nie są odpowiedzią.
Edytować:
Po ostatniej uruchomienia tej aplikacji, okazuje się, że to zachowanie zaczęła występować na wszystkich urządzeniach po pierwszym restarcie. Co wydaje mi się szalone, ale patrząc przez proces restartu, nie mogę właściwie stwierdzić, co się dzieje.
źródło
finish()
je w przypadkach, w których zaczyna odActivity
nowa, zamiast je wznawiać.Odpowiedzi:
Występujące zachowanie jest spowodowane problemem występującym w niektórych programach uruchamiających system Android od API 1. Szczegółowe informacje o błędzie oraz możliwe rozwiązania można znaleźć tutaj: https://code.google.com/p/android/issues/ szczegół? id = 2373 .
Jest to stosunkowo powszechny problem na urządzeniach Samsung, a także innych producentów, którzy używają niestandardowego programu uruchamiającego / skórki. Nie widziałem, aby problem występował w standardowym programie uruchamiającym Androida.
Zasadniczo aplikacja nie uruchamia się ponownie całkowicie, ale Aktywność uruchamiania jest uruchamiana i dodawana na górze stosu aktywności, gdy aplikacja jest wznawiana przez program uruchamiający. Możesz potwierdzić, że tak jest, klikając przycisk Wstecz po wznowieniu aplikacji i wyświetleniu działania Uruchom. Powinieneś zostać przeniesiony do działania, które powinno być wyświetlane po wznowieniu aplikacji.
Obejście, które zdecydowałem się wdrożyć w celu rozwiązania tego problemu, polega na sprawdzeniu kategorii Intent.CATEGORY_LAUNCHER i akcji Intent.ACTION_MAIN w celu, który rozpoczyna początkową aktywność. Jeśli te dwie flagi są obecne, a działanie nie znajduje się w katalogu głównym zadania (co oznacza, że aplikacja była już uruchomiona), wówczas wywołuję działanie kończące () na początkowym działaniu. To dokładne rozwiązanie może nie działać, ale coś podobnego powinno.
Oto, co robię w onCreate () działania początkowego / uruchamiania:
źródło
To pytanie jest nadal aktualne w 2016 r. Dzisiaj tester kontroli jakości zgłosił aplikację ponownego uruchomienia kopalni zamiast wznawiania jej ze startera akcji w systemie Android M.
W rzeczywistości system dodawał uruchomioną aktywność do bieżącego stosu zadań , ale użytkownikowi wydawało się, że nastąpiło ponowne uruchomienie i stracili pracę. Sekwencja była:
Uwaga: ten problem nie występuje w przypadku debugowania APK wdrożonych przez ADB, tylko w APK pobranych ze Sklepu Play lub załadowanych z boku. W tych ostatnich przypadkach zamiar uruchomienia od kroku 5 zawierał flagę
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
, ale nie w przypadkach debugowania. Problem zniknie, gdy aplikacja zostanie uruchomiona na zimno z poziomu programu uruchamiającego. Podejrzewam, że Zadanie jest zasiane zniekształconą (a dokładniej, niestandardową) intencję, która uniemożliwia prawidłowe zachowanie podczas uruchamiania, dopóki zadanie nie zostanie całkowicie usunięte.Próbowałem różnych trybów uruchamiania działań , ale te ustawienia zbytnio odbiegają od standardowych zachowań, których oczekiwałby użytkownik: wznawianie zadania w działaniu B. Zobacz następującą definicję oczekiwanego zachowania w przewodniku Zadania i układanie stosów u dołu strony w sekcji „Rozpoczęcie zadania”:
Uznałem, że ta odpowiedź jest istotna i umieściłem ją w metodzie „onCreate” mojej aktywności root (A), aby odpowiednio ją wznowić po otwarciu aplikacji przez użytkownika.
AKTUALIZACJA: przeniosłem to rozwiązanie z parsowania flag zamiaru na sprawdzanie, czy działanie znajduje się bezpośrednio w katalogu głównym zadania. Flagi intencji są trudne do przewidzenia i przetestowania na różne sposoby otwarcia aktywności GŁÓWNEJ (Uruchom z domu, uruchom z przycisku „w górę”, uruchom ze Sklepu Play itp.)
źródło
Aha! (tldr; patrz instrukcje pogrubione na dole)
Znalazłem problem ... myślę.
Zacznę od przypuszczenia. Po naciśnięciu programu uruchamiającego uruchamia się on domyślnie
Activity
lub, jeśli programTask
uruchamiany przez poprzednie uruchomienie jest otwarty, przesuwa go na przód. Mówiąc inaczej - jeśli na dowolnym etapie nawigacji utworzysz nowyTask
ifinish
stary, program uruchamiający nie będzie już wznawiać aplikacji.Jeśli to przypuszczenie jest prawdziwe, jestem pewien, że powinien to być błąd, biorąc pod uwagę, że każdy z nich
Task
jest w tym samym procesie i jest tak samo ważny jako kandydat do wznowienia, jak pierwszy?Mój problem został wtedy rozwiązany poprzez usunięcie tych flag z kilku
Intents
:Chociaż jest całkiem oczywiste, że
FLAG_ACTIVITY_NEW_TASK
tworzy nowyTask
, nie doceniłem, że powyższe przypuszczenie było skuteczne. Uznałem to za winowajcę i usunąłem z niego w celu przetestowania i nadal miałem problem, więc go odrzuciłem. Jednak nadal miałem następujące warunki:Mój ekran powitalny zaczynał „główny”
Activity
w mojej aplikacji przy użyciu powyższej flagi. W końcu, gdybym „zrestartował” moją aplikację iActivity
nadal działa, wolałbym zachować jej informacje o stanie.W dokumentacji zauważysz , że nie wspomina o rozpoczęciu nowego
Task
:Miałem więc sytuację opisaną poniżej:
A
uruchomionyB
zFLAG_ACTIVITY_CLEAR_TOP
,A
kończy.B
chce zrestartować usługę, więc wysyła użytkownika, doA
którego ma logikę restartu usługi i interfejs użytkownika (bez flag).A
uruchamiaB
z FLAG_ACTIVITY_CLEAR_TOP,A
kończy.Na tym etapie
FLAG_ACTIVITY_CLEAR_TOP
restartuje się druga flaga,B
która znajduje się na stosie zadań. Zakładam, że musi to zniszczyćTask
i rozpocząć nowy, powodując mój problem, co jest bardzo trudną sytuacją, jeśli mnie o to poprosisz!Więc jeśli wszystkie moje przypuszczenia są prawidłowe:
Launcher
Tylko wznawia początkowo utworzone zadanieFLAG_ACTIVITY_CLEAR_TOP
jeśli zrestartuje jedyne pozostałeActivity
, również odtworzy nowyTask
źródło
Miałem ten sam problem na urządzeniach Samsung. Po wielu poszukiwaniach żadna z tych odpowiedzi nie działała dla mnie. Odkryłem, że w pliku AndroidManifest.xml
launchMode
jest ustawiony nasingleInstance
(android:launchMode="singleInstance"
). UsunięcielaunchMode
atrybutu naprawiło mój problem.źródło
launchMode
wartości: inthecheesefactory.com/blog/…Na moim Catie s60 włączyłem opcję „Nie zachowuj aktywności” w opcjach programisty, wyłączenie tej opcji pozwoliło mi na przełączanie aplikacji bez utraty stanu aplikacji ...
źródło
To rozwiązanie działało dla mnie:
kredyt: Muszę zminimalizować aplikację Android po kliknięciu przycisku Wstecz
może nie działać na wszystkich urządzeniach, ale z powodzeniem tworzy zachowanie przycisku Home po naciśnięciu przycisku Wstecz, zatrzymując w ten sposób działanie, a nie kończąc je.
źródło
Miałem ten sam problem, przyczyną było:
(Kod Kotlin, w MainActivity)
Dlatego podczas nawigowania do mojej MainActivity z mojego LoginActivity korzystam z tego:
Kiedy używam tych flag, nie muszę mieć onBackPressed () w mojej MainActivity, to wyjdzie z aplikacji naturalnie po kliknięciu wstecz. A po naciśnięciu przycisku Home i powrocie do aplikacji nie uruchamia się ponownie.
źródło
Rozwiązanie dla osób, które nie mają pojęcia o programowaniu i doświadczaniu tego problemu na swoim telefonie z Androidem. Dzieje się tak głównie z powodu aktualizacji wersji Androida (tylko moje założenie). Po aktualizacji wszystkie aplikacje są zoptymalizowane pod kątem zużycia mniejszej baterii. Ale to z kolei spowalnia twoje urządzenie.
Jak rozwiązać
Przejdź do ustawień >> Aplikacje >> ustawienia aplikacji (poszukaj ustawień, wpisz znak gdziekolwiek na ekranie - na różnych urządzeniach jest inaczej) >> optymalizacja baterii (lub podobna opcja [wprowadź opis obrazu tutaj] [1] włączony) >> przenieś wszystko aplikacje do stanu „niezoptymalizowanego” (trzeba wykonać ręcznie 1 na 1 - w niektórych telefonach może być dozwolone / zabronione). Twoja aplikacja uruchamiająca musi być „niezoptymalizowana” (w moim przypadku Zen UI - to chyba winowajca - możesz spróbować zoptymalizować / Nie zoptymalizować i zrestartować innej aplikacji, jeśli masz czas). Teraz uruchom ponownie telefon. (nie trzeba resetować danych / trybu awaryjnego ani żadnych problemów)
Spróbuj teraz wielozadaniowość. :) Naciśnięcie ikony uruchamiania powinno teraz spowodować wznowienie bieżącego zadania. :) Twoje urządzenie stanie się Nie martw się baterią, i tak się rozładuje.
źródło
Bezcenny dla twoich użytkowników. Idealne wznowienie nawet po tygodniach siedzenia na ostatnio używanej liście aplikacji.
Wygląda to na wznowienie dla użytkownika, ale w rzeczywistości jest pełnoprawnym początkiem.
Tło: Pamięć używana przez aplikacje, które są główną działalnością, która nie rozpoczęła zadania, jest łatwa do odzyskania. OS może po prostu ponownie uruchomić aplikację z oryginalnym pakietem przekazanym do onCreate. Możesz jednak dodać do oryginalnego pakietu,
onSaveInstanceState
więc gdy aplikacja zostanie zrestartowana przez system operacyjny, możesz przywrócić stan instancji i nikt nie jest mądrzejszy, czy aplikacja została ponownie uruchomiona, czy wznowiona. Weźmy na przykład klasyczny program map. Użytkownik przesuwa się do pozycji na mapie, a następnie naciska klawisz Home. Dwa tygodnie później ta aplikacja do mapowania wciąż znajduje się na liście najnowszych aplikacji, podobnie jak Facebook, Pandora i Candy Crush. System operacyjny nie tylko zapisuje nazwę aplikacji dla ostatnio używanych aplikacji, ale także zapisuje oryginalny pakiet użyty do uruchomienia aplikacji. Jednak programista zakodowałonSaveInstanceState
Metoda, więc pakiet oryginalnych zawiera teraz wszystkie materiały i informacje niezbędne do zbudowania aplikacji, więc wygląda na to, że została wznowiona.Przykład: Zapisz bieżącą pozycję kamery w onSaveInstanceState, tylko jeśli aplikacja jest rozładowana i musi zostać ponownie uruchomiona kilka tygodni później z listy najnowszych aplikacji.
Uwaga: możesz także użyć tej
onRestoreInstanceState
metody, ale łatwiej jest mi przywrócić instancję wonCreate
.Jest to bardziej niż prawdopodobne, co dzieje się w Twojej aplikacji. Na niektórych urządzeniach aplikacja jest zwalniana w celu zwolnienia pamięci. Tak, jest kilka flag, które pomagają, ale flagi nie wychwycą każdego niuansu Twojej aplikacji, a flagi nie utrzymają cię przy życiu przez tygodnie, jak chcesz
onSaveInstanceState
. Musisz zakodować idealne dwa tygodnie później wznowić. Złożona aplikacja nie będzie łatwym zadaniem, ale jesteśmy za tobą i jesteśmy tutaj, aby Ci pomóc.Powodzenia
źródło