Aplikacja uruchamia się raczej niż wznawia

194

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 Activityz akcją android.intent.action.MAINi 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 Activitybez 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 Activitynie 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.

Graeme
źródło
1
Może to wydawać się trywialne pytanie, ale czy ustawiłeś opcję „Nie trzymaj działań” w opcjach tworzenia Xooma?
Andrew Schuster
Nie (chciałbym! :)) - zarejestrowałem cykl życia każdego działania i działania w tle jako wciąż dostępne (są zatrzymane - nie zniszczone). Wydaje się, że system operacyjny wzywa finish()je w przypadkach, w których zaczyna od Activitynowa, zamiast je wznawiać.
Graeme
1
Jeśli naciśniesz przycisk Home, a następnie kliknij ikonę programu uruchamiającego, zachowanie wznawiania jest domyślne dla Androida, jak zapewne wiesz. Jeśli jednak naciśniesz przycisk Wstecz, aby powrócić do ekranu głównego, większość telefonów zakończy () aplikację. Czy to możliwe, że jakakolwiek metoda, której używasz do wyjścia z aplikacji, jest inna na różnych urządzeniach? Czy możesz wylogować się z OnKeyUpEvent, aby sprawdzić, czy niektórzy dziwnie nie obsługują twardych / miękkich klawiszy?
Nick Cardoso
2
Nie - jestem pewien problemu, jak wspomniano powyżej. Użycie strony głównej do umieszczenia aplikacji w tle (a nie powrót, co masz rację, zakończyłoby () działanie). W Xoomie można wznowić aplikację z Listy zadań (po prostu nie z Launchera), więc backstack zdecydowanie nie został zabity.
Graeme
1
Odpowiedź z nagrodą jest sposobem na rozwiązanie problemu opisanego w pytaniu. Oznacziłem własną odpowiedź jako „poprawną”, ponieważ chociaż czasami problem jest spowodowany błędem aplikacji w programie uruchamiającym (jak zauważono w jego odpowiedzi), mój szczególny problem spowodowany był przełączaniem zadań. Rozwiązanie obu problemów rozwiązuje jego rozwiązanie.
Graeme

Odpowiedzi:

238

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:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }
starkej2
źródło
4
Jak dotąd działa to dla mnie bez negatywnych skutków ubocznych. W oparciu o logiczne założenia nie widzę powodu, dla którego nie jest poprawny.
javahead76
3
Myślę, że to jest właściwy sposób radzenia sobie z tym błędem. Pracuje dla mnie.
Sokolov,
3
wykonał dla mnie pracę, zweryfikowany na około 8 różnych urządzeniach. Dziękuję bardzo!
shaya ajzner
3
WOOOOOW naprawił mój problem, szukałem rozwiązania przez ostatnie 2 godziny
Jean Raymond Daher
2
Dzięki @ starkej2. Działa jak urok.
Rajeev Sahu
54

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:

  1. Pobierz ze sklepu Play (lub bocznego apk)
  2. Uruchom aplikację z okna dialogowego sklepu Play: pojawia się działanie A [stos zadań: A]
  3. Przejdź do działania B [stos zadań: A -> B]
  4. Naciśnij przycisk „Strona główna”
  5. Uruchom aplikację z szuflady aplikacji: pojawia się działanie A! [stos zadań: A -> B -> A] (użytkownik może nacisnąć przycisk „Wstecz”, aby przejść do działania „B” stąd)

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”:

Tego rodzaju filtr zamiarów powoduje, że ikona i etykieta działania są wyświetlane w programie uruchamiającym aplikacje, umożliwiając użytkownikom uruchomienie działania i powrót do utworzonego zadania w dowolnym momencie po jego uruchomieniu.

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.

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

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.)

Rich Ehmer
źródło
4
„Problem zniknie, gdy aplikacja zostanie uruchomiona na zimno z poziomu programu uruchamiającego”. To jest najdziwniejsza część i ja też to zauważyłem - po pierwszym uruchomieniu aplikacja zaczyna działać normalnie. Taki dziwny błąd. Dziękujemy za tak dokładną analizę i rozwiązanie.
Oded
11
Uwaga: problem można odtworzyć ponownie po początkowym wyczyszczeniu (poprzez „zimne uruchamianie”, tak jak to opisano) za pomocą „Otwórz” na stronie aplikacji w Google Play, nawet jeśli zainstalowałeś go za pośrednictwem Android Studio . Uważam, że jest to bardzo przydatne do weryfikacji poprawności działania.
Oded
Ładne wyjaśnienie!
karanatwal.github.io
Dzięki za wyjaśnienie :)
AndroidEnthusiast
2
Dzieje się tak w przypadku wielu aplikacji. Zdjęcia Google to główne, które przetestowałem.
Raghubansh Mani
19

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 Activitylub, jeśli program Taskuruchamiany przez poprzednie uruchomienie jest otwarty, przesuwa go na przód. Mówiąc inaczej - jeśli na dowolnym etapie nawigacji utworzysz nowy Taski finishstary, 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 Taskjest 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:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

Chociaż jest całkiem oczywiste, że FLAG_ACTIVITY_NEW_TASKtworzy nowy Task, 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:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Mój ekran powitalny zaczynał „główny” Activityw mojej aplikacji przy użyciu powyższej flagi. W końcu, gdybym „zrestartował” moją aplikację i Activitynadal działa, wolałbym zachować jej informacje o stanie.

W dokumentacji zauważysz , że nie wspomina o rozpoczęciu nowego Task:

Jeśli jest ustawiony, a uruchamiane działanie jest już uruchomione w bieżącym zadaniu, to zamiast uruchamiać nowe wystąpienie tego działania, wszystkie pozostałe działania nad nim zostaną zamknięte, a ten zamiar zostanie dostarczony do (teraz do góry) stara aktywność jako nowa intencja.

Rozważmy na przykład zadanie składające się z działań: A, B, C, D. Jeśli D wywoła startActivity () z zamiarem, który rozwiązuje składnik B, wówczas C i D zostaną zakończone i B otrzyma podaną zamiar , w wyniku czego stos jest teraz: A, B.

Aktualnie działająca instancja działania B w powyższym przykładzie otrzyma nowy zamiar, który tutaj zaczynasz w metodzie onNewIntent (), lub sam zostanie zakończony i zrestartowany z nowym zamiarem. Jeśli zadeklarował tryb uruchamiania jako „wielokrotny” (domyślny) i nie ustawiłeś FLAG_ACTIVITY_SINGLE_TOP w tym samym celu, to zostanie on zakończony i ponownie utworzony; dla wszystkich innych trybów uruchamiania lub jeśli ustawiono FLAG_ACTIVITY_SINGLE_TOP, ten zamiar zostanie dostarczony do bieżącej instancji onNewIntent ().

Ten tryb uruchamiania może być również używany z dobrym skutkiem w połączeniu z FLAG_ACTIVITY_NEW_TASK: jeśli zostanie użyty do uruchomienia aktywności root zadania, spowoduje przeniesienie aktualnie uruchomionej instancji tego zadania na pierwszy plan, a następnie wyczyści go do stanu root. Jest to szczególnie przydatne na przykład podczas uruchamiania działania z poziomu menedżera powiadomień.

Miałem więc sytuację opisaną poniżej:

  • Auruchomiony Bz FLAG_ACTIVITY_CLEAR_TOP, Akończy.
  • Bchce zrestartować usługę, więc wysyła użytkownika, do Aktórego ma logikę restartu usługi i interfejs użytkownika (bez flag).
  • Auruchamia Bz FLAG_ACTIVITY_CLEAR_TOP, Akończy.

Na tym etapie FLAG_ACTIVITY_CLEAR_TOPrestartuje się druga flaga, Bktóra znajduje się na stosie zadań. Zakładam, że musi to zniszczyć Taski 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:

  • LauncherTylko wznawia początkowo utworzone zadanie
  • FLAG_ACTIVITY_CLEAR_TOPjeśli zrestartuje jedyne pozostałe Activity, również odtworzy nowyTask
Graeme
źródło
FLAG_ACTIVITY_CLEAR_TOP nie tworzy nowego zadania ani nie uruchamia ponownie działania, które próbujesz uruchomić, jeśli jest to jedyne pozostałe działanie. „Jeśli jest ustawiony, a uruchamiane działanie jest już uruchomione w bieżącym zadaniu, to zamiast uruchamiać nowe wystąpienie tego działania, wszystkie pozostałe działania nad nim zostaną zamknięte, a ten zamiar zostanie dostarczony do (teraz na górze) stara aktywność jako nowa intencja ”.
starkej2
2
Zdaję sobie sprawę, że tak nie jest - ale w mojej instancji dzieje się tak w przypadku prób i błędów. Usunięcie tych flag rozwiązuje problem.
Graeme
To nie tworzy idealnego wznowienia na wszystkich urządzeniach we wszystkich warunkach.
danny117
Usunięcie flag rozwiązało problem. Dzięki
Sealer_05
Mam scenariusz powitalny / ekran główny, ale nie używam żadnych flag do przejścia od powitania do głównego, ale problem jest dla mnie powtarzalny - to rozwiązanie nie działa dla mnie.
ror
12

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.xmllaunchMode jest ustawiony na singleInstance( android:launchMode="singleInstance"). Usunięcie launchModeatrybutu naprawiło mój problem.

Ali
źródło
Rzeczywiście, to też załatwiło sprawę dla mnie. Ta odpowiedź z innego SO pytania była pomocna: stackoverflow.com/a/21622266/293280 . I ten zapis różnych rodzajów launchModewartości: inthecheesefactory.com/blog/…
Joshua Pinter
Ta poprawka zadziałała dla mnie! Dodano to nie w manifestie, ale w atrybucie aktywności nad główną klasą aktywności.
Calin Vlasin
@CalinVlasin czy mógłbyś mi dokładnie pokazać, jak korzystałeś z launchMode? gdzie to umieściłeś? obecnie mam to w ten sposób, ale powoduje to problem: <działanie android: nazwa = ". UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" android: launchMode = "singleTop" android: windowSoftInputMode = "stateAlwaysHidden | adjustResize ">
j2emanue
To też był mój problem. Myślę, że należy tego używać w połączeniu z zaakceptowaną odpowiedzią (! IsTaskRoot ...
behelit
1

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 ...

ptp
źródło
Nie mam pojęcia jak to zrobić, ale było to WŁĄCZONE na moim urządzeniu.
realPro
0

To rozwiązanie działało dla mnie:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

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.

Russell Chisholm
źródło
Ciekawa sztuczka, ale nie rozwiązuje problemu, jak stwierdzono. Bardzo przydatne w przypadku innych problemów / pytań.
Graeme
Przycisk Wstecz ma określony cel i użytkownicy oczekują, że przycisk Wstecz zrobi to, co powinien. Zastąpienie go w jakikolwiek sposób jest złe i, moim zdaniem, wysoce nieprofesjonalne.
Bugs Happen
-1

Miałem ten sam problem, przyczyną było:

(Kod Kotlin, w MainActivity)

override fun onBackPressed() {
    finish()
}

Dlatego podczas nawigowania do mojej MainActivity z mojego LoginActivity korzystam z tego:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

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.

Christer
źródło
-2

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.

Arun Antony
źródło
-8

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, onSaveInstanceStatewię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.

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

Uwaga: możesz także użyć tej onRestoreInstanceStatemetody, ale łatwiej jest mi przywrócić instancję w onCreate.

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

danny117
źródło
Nie jest to spowodowane powszechnymi problemami z pamięcią lub domyślnymi warunkami „stanu wstrzymania”. Próbowałem mojej aplikacji na wielu urządzeniach (niektóre z dużą pamięcią, niektóre z mniejszą pamięcią).
Graeme,
Dlatego zapisujesz trwałe dane w onPause Próbowałem wznowić działanie mojej aplikacji do dwóch tygodni na telefonie, z którego korzystam codziennie i powiem ci, że po dwóch tygodniach zostanie wywołana metoda onCreate, a system operacyjny przejdzie w pakiet, w którym zapisałem Korzystamy z onSaveSessionState i danych w pakiecie, aby moja aktywność wyglądała dokładnie tak, jak ją opuściłem. Od mojej odpowiedzi minęły więc tylko trzy dni, więc nie ma mowy, żebyś ukończył dwutygodniowy test. Podsumowanie: Aplikację można zamknąć w dowolnym momencie w tle.
danny117
@ danny117 Nie wydaje mi się, żebyś dokładnie rozumiał problem, który występuje w Graeme
starkej2,
Rozumiem problem Graeme. Na niektórych urządzeniach wznawianie połączeń aplikacji na Utwórz. Brzmi dokładnie tak, jak mój HTC EVO (Piernik), który zabiłby aplikację tylko po to, aby obrócić ekran. Spójrz na dokumenty, które mówi, aby aplikacja mogła zostać przywrócona w onCreate developer.android.com/reference/android/app/…
danny117,
@ danny117 to prawda, ale problem, który ma, nie jest związany z odtwarzaniem pojedynczego działania po wznowieniu aplikacji (co jest oczekiwane), ale rozpoczyna się nieprawidłowe działanie
starkej2 24.04.2014