Die App wird neu gestartet und nicht fortgesetzt

194

Hoffentlich kann mir jemand helfen, wenn nicht sogar eine Lösung, zumindest eine Erklärung für ein Verhalten herauszufinden.

Das Problem:

Auf einigen Geräten führt das Drücken des Startsymbols dazu, dass die aktuelle Aufgabe fortgesetzt wird, auf anderen wird die anfängliche Startabsicht ausgelöst (die App wird effektiv neu gestartet). Warum passiert das?

Das Detail:

Wenn Sie auf das "Startsymbol" klicken, wird die App normal gestartet. Das heißt, ich gehe davon aus, dass eine Absicht mit dem Namen Ihres ersten Activitymit der Aktion android.intent.action.MAINund der Kategorie gestartet wird android.intent.category.LAUNCHER. Dies kann jedoch nicht immer der Fall sein:

Wenn Sie auf den meisten Geräten das Startsymbol drücken, nachdem die App bereits ausgeführt wurde, wird die aktuell ausgeführte Aktivität in diesem Prozess fortgesetzt ( NICHT die ursprüngliche Activity). Es wird auf die gleiche Weise fortgesetzt, als hätten Sie es unter "Letzte Aufgaben" im Menü "Betriebssystem" ausgewählt. Dies ist das Verhalten, das ich auf allen Geräten möchte .

Bei ausgewählten anderen Geräten tritt jedoch ein anderes Verhalten auf:

  • Wenn Sie auf dem Motorola Xoom auf das Startsymbol klicken, startet die App immer den ersten Start, Activityunabhängig davon, was gerade ausgeführt wird. Ich gehe davon aus, dass die Launcher-Symbole immer die Absicht "LAUNCHER" starten.

  • Wenn Sie auf dem Samsung Tab 2 auf das Startsymbol drücken und die App gerade installiert haben, wird immer die Initiale gestartet Activity(wie beim Xoom). Nach dem Neustart des Geräts nach der Installation wird jedoch stattdessen das Startsymbol angezeigt Setzen Sie die App fort. Ich gehe davon aus, dass diese Geräte beim Gerätestart "installierte Apps" zu einer Nachschlagetabelle hinzufügen, damit die Startsymbole die laufenden Aufgaben korrekt wieder aufnehmen können.

Ich habe viele Antworten gelesen , die meinem Problem ähnlich klingen , aber einfach das Hinzufügen android:alwaysRetainTaskState="true"oder Verwenden launchMode="singleTop"von Activitysind nicht die Antwort.

Bearbeiten:

Nach dem letzten Start dieser App stellen wir fest, dass dieses Verhalten nach dem ersten Neustart auf allen Geräten auftritt . Was mir verrückt erscheint, aber wenn ich den Neustartprozess durchschaue, kann ich nicht finden, was falsch läuft.

Graeme
quelle
1
Dies mag wie eine triviale Frage erscheinen, aber haben Sie in Ihren Entwicklungsoptionen für Xoom "Aktivitäten nicht beibehalten" auf "wahr" gesetzt?
Andrew Schuster
Nein (ich wünschte! :)) - Ich habe den Lebenszyklus jeder Aktivität und der Aktivitäten im Hintergrund als noch verfügbar protokolliert (Sie werden gestoppt - nicht zerstört). Das Betriebssystem scheint finish()sie in Fällen aufzurufen , in denen es das erste Activityerneut beginnt , anstatt sie wieder aufzunehmen.
Graeme
1
Wenn Sie die Home-Taste gedrückt haben und dann auf das Startsymbol klicken, ist das Wiederaufnahmeverhalten die Standardeinstellung für Android, wie Sie wahrscheinlich wissen. Wenn Sie jedoch die Zurück-Taste drücken, um zum Startbildschirm zurückzukehren, beenden die meisten Telefone die App (). Ist es möglich, dass die Methode, mit der Sie die App beenden, auf den verschiedenen Geräten unterschiedlich ist? Könnten Sie sich beim onKeyUpEvent abmelden, um zu überprüfen, ob einige die harten / weichen Tasten nicht seltsam handhaben?
Nick Cardoso
2
Nein - ich bin mir des oben genannten Problems sicher. Wenn Sie die App zu Hause verwenden, um sie in den Hintergrund zu stellen (nicht zurück, was Sie zu Recht getan haben, wird die Aktivität beendet ()). Auf dem Xoom ist es möglich, die App aus der Aufgabenliste (nur nicht aus dem Launcher) fortzusetzen, sodass der Backstack definitiv nicht getötet wurde.
Graeme
1
Die Antwort mit dem Kopfgeld ist der Weg, um das in der Frage beschriebene Problem zu beheben. Markierte meine eigene Antwort als "richtig", da das Problem zwar manchmal durch einen App-Fehler im Launcher verursacht wurde (wie in seiner Antwort angegeben), mein spezielles Problem jedoch durch das Wechseln von Aufgaben verursacht wurde. Die Lösung für beide Probleme wird durch seine Lösung festgelegt.
Graeme

Antworten:

238

Das aufgetretene Verhalten wird durch ein Problem verursacht, das in einigen Android-Startern seit API 1 auftritt. Details zum Fehler sowie mögliche Lösungen finden Sie hier: https://code.google.com/p/android/issues/ Detail? id = 2373 .

Dies ist ein relativ häufiges Problem bei Samsung-Geräten sowie bei anderen Herstellern, die einen benutzerdefinierten Launcher / Skin verwenden. Ich habe das Problem bei einem Standard-Android-Launcher nicht gesehen.

Grundsätzlich wird die App nicht vollständig neu gestartet, aber Ihre Startaktivität wird gestartet und oben im Aktivitätsstapel hinzugefügt, wenn die App vom Launcher fortgesetzt wird. Sie können dies bestätigen, indem Sie auf die Schaltfläche "Zurück" klicken, wenn Sie die App fortsetzen und die Startaktivität angezeigt wird. Sie sollten dann zu der Aktivität gebracht werden, die angezeigt werden soll, wenn Sie die App fortsetzen.

Die Problemumgehung, die ich implementiert habe, um dieses Problem zu beheben, besteht darin, in der Absicht, mit der die anfängliche Aktivität gestartet wird, nach der Kategorie Intent.CATEGORY_LAUNCHER und der Aktion Intent.ACTION_MAIN zu suchen. Wenn diese beiden Flags vorhanden sind und sich die Aktivität nicht im Stammverzeichnis der Aufgabe befindet (dh die App wurde bereits ausgeführt), rufe ich bei der ersten Aktivität finish () auf. Diese genaue Lösung funktioniert möglicherweise nicht für Sie, aber etwas Ähnliches sollte.

Folgendes mache ich in onCreate () der Initial / Launch-Aktivität:

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

        finish();
        return;
    }
starkej2
quelle
4
Bisher funktioniert dies bei mir ohne nachteilige Nebenwirkungen. Aufgrund der logischen Annahmen sehe ich keinen Grund, warum es nicht gültig ist.
javahead76
3
Ich denke, dies ist der richtige Weg, um mit diesem Fehler umzugehen. Funktioniert bei mir.
Sokolov
3
hat die Arbeit für mich erledigt, verifiziert auf ca. 8 verschiedenen Geräten. vielen Dank!
Shaya Ajzner
3
WOOOOOW hat mein Problem behoben. Ich habe in den letzten 2 Stunden nach einer Lösung gesucht
Jean Raymond Daher
2
Danke @ starkej2. Lief wie am Schnürchen.
Rajeev Sahu
54

Diese Frage ist auch 2016 noch relevant. Heute berichtete ein QS-Tester, dass eine App von mir neu gestartet wurde, anstatt vom Stock Launcher in Android M wieder aufgenommen zu werden.

In Wirklichkeit fügte das System die gestartete Aktivität dem aktuellen Task-Stack hinzu , aber es schien dem Benutzer, als ob ein Neustart stattgefunden hätte und er seine Arbeit verloren hätte. Die Sequenz war:

  1. Download aus dem Play Store (oder Sideload apk)
  2. Starten Sie die App über den Play Store-Dialog: Aktivität A wird angezeigt [Aufgabenstapel: A]
  3. Navigieren Sie zu Aktivität B [Aufgabenstapel: A -> B]
  4. Drücken Sie die Home-Taste
  5. App aus App-Schublade starten: Aktivität A erscheint! [Aufgabenstapel: A -> B -> A] (Benutzer kann die Schaltfläche "Zurück" drücken, um von hier aus zur Aktivität "B" zu gelangen.)

Hinweis: Dieses Problem tritt nicht bei Debug-APKs auf, die über ADB bereitgestellt werden, sondern nur bei APKs, die aus dem Play Store heruntergeladen oder von der Seite geladen wurden. In letzteren Fällen enthielt die Startabsicht aus Schritt 5 das Flag Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT, jedoch nicht in den Debug-Fällen. Das Problem verschwindet, sobald die App vom Launcher aus kalt gestartet wurde. Mein Verdacht ist, dass die Aufgabe mit einer fehlerhaften (genauer, nicht standardmäßigen) Absicht versehen ist, die das korrekte Startverhalten verhindert, bis die Aufgabe vollständig gelöscht ist.

Ich habe verschiedene Aktivitätsstartmodi ausprobiert , aber diese Einstellungen weichen zu stark vom Standardverhalten ab, das der Benutzer erwarten würde: Wiederaufnahme der Aufgabe bei Aktivität B. Siehe die folgende Definition des erwarteten Verhaltens im Handbuch zu Aufgaben und Backstack am Ende der Seite unter 'Starten einer Aufgabe':

Ein solcher Absichtsfilter bewirkt, dass ein Symbol und eine Bezeichnung für die Aktivität im Anwendungsstarter angezeigt werden, sodass Benutzer die Aktivität starten und jederzeit nach dem Start zu der Aufgabe zurückkehren können, die sie erstellt.

Ich fand diese Antwort relevant und fügte Folgendes in die 'onCreate'-Methode meiner Stammaktivität (A) ein, damit sie beim Öffnen der Anwendung ordnungsgemäß fortgesetzt wird.

                    /**
     * 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;
    }

UPDATE: Diese Lösung wurde vom Parsen von Intent-Flags auf das Abfragen verschoben, wenn sich die Aktivität direkt im Stammverzeichnis der Aufgabe befindet. Absichtsflags sind schwer vorherzusagen und zu testen, da eine MAIN-Aktivität auf verschiedene Arten geöffnet werden kann (Start von zu Hause aus, Start über die Schaltfläche "Auf", Start über den Play Store usw.).

Rich Ehmer
quelle
4
"Das Problem verschwindet, sobald die App vom Launcher aus kalt gestartet wurde." Dies ist der seltsamste Teil, und ich habe ihn auch beobachtet. Wenn Sie die App nach dem ersten Start beenden, verhält sie sich wieder normal. So ein seltsamer Fehler. Vielen Dank für die gründliche Analyse und für die Lösung.
Oded
11
Hinweis: Sie können das Problem nach dem ersten Löschen erneut reproduzieren (durch "Kaltstart", wie Sie es beschrieben haben), indem Sie "Öffnen" auf der Google Play-Seite der App verwenden, selbst wenn Sie das APK über Android Studio installiert haben . Ich fand dies sehr nützlich, um zu überprüfen, ob das Update funktioniert hat.
Oded
Schöne Erklärung!
karanatwal.github.io
Vielen Dank für diese Erklärung :)
AndroidEnthusiast
2
Dies passiert bei vielen Apps. Google Fotos sind eine wichtige, die ich getestet habe.
Raghubansh Mani
19

Aha! (tldr; Siehe die fett gedruckten Aussagen unten)

Ich habe das Problem gefunden ... denke ich.

Also werde ich mit einer Vermutung beginnen. Wenn Sie den Launcher drücken, wird entweder die Standardeinstellung gestartet, Activityoder wenn eine Taskvon einem vorherigen Start gestartete Option geöffnet ist, wird sie nach vorne verschoben. Anders ausgedrückt: Wenn Sie zu irgendeinem Zeitpunkt in Ihrer Navigation eine neue Taskund finisheine alte erstellen , setzt der Launcher Ihre App jetzt nicht mehr fort.

Wenn diese Annahme wahr ist, bin ich mir ziemlich sicher, dass dies ein Fehler sein sollte, da sich jeder Taskim selben Prozess befindet und ein ebenso gültiger Lebenslaufkandidat ist wie der erste, der erstellt wurde?

Mein Problem wurde dann behoben, indem diese Flags von einigen entfernt wurden Intents:

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

Obwohl es ziemlich offensichtlich ist, dass FLAG_ACTIVITY_NEW_TASKein neues erstellt wird Task, habe ich nicht gewürdigt, dass die obige Annahme in Kraft ist. Ich habe dies als Schuldigen angesehen und zum Testen entfernt, und ich hatte immer noch ein Problem, also habe ich es abgewiesen. Ich hatte jedoch immer noch die folgenden Bedingungen:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Mein Begrüßungsbildschirm startete das "Haupt" Activityin meiner App mit dem obigen Flag. Wenn ich meine App "neu gestartet" hätte und die Activitynoch läuft, würde ich die Statusinformationen lieber beibehalten.

Sie werden in der Dokumentation feststellen, dass das Starten eines neuen nicht erwähnt wird Task:

Wenn diese Option festgelegt ist und die zu startende Aktivität bereits in der aktuellen Aufgabe ausgeführt wird, werden anstelle einer neuen Instanz dieser Aktivität alle anderen darüber liegenden Aktivitäten geschlossen und diese Absicht an die (jetzt) ​​übergeben top) alte Aktivität als neue Absicht.

Stellen Sie sich zum Beispiel eine Aufgabe vor, die aus den folgenden Aktivitäten besteht: A, B, C, D. Wenn D startActivity () mit einer Absicht aufruft, die in die Komponente der Aktivität B aufgelöst wird, werden C und D beendet und B erhält die angegebene Absicht , was dazu führt, dass der Stapel jetzt ist: A, B.

Die aktuell ausgeführte Instanz von Aktivität B im obigen Beispiel erhält entweder die neue Absicht, die Sie hier in ihrer onNewIntent () -Methode starten, oder wird selbst beendet und mit der neuen Absicht neu gestartet. Wenn der Startmodus als "mehrfach" (Standardeinstellung) deklariert wurde und Sie FLAG_ACTIVITY_SINGLE_TOP nicht in derselben Absicht festgelegt haben, wird er beendet und neu erstellt. Für alle anderen Startmodi oder wenn FLAG_ACTIVITY_SINGLE_TOP festgelegt ist, wird diese Absicht an onNewIntent () der aktuellen Instanz übergeben.

Dieser Startmodus kann auch in Verbindung mit FLAG_ACTIVITY_NEW_TASK effektiv verwendet werden: Wenn er zum Starten der Stammaktivität einer Aufgabe verwendet wird, wird jede aktuell ausgeführte Instanz dieser Aufgabe in den Vordergrund gerückt und anschließend in ihren Stammzustand gelöscht. Dies ist beispielsweise besonders nützlich, wenn Sie eine Aktivität über den Benachrichtigungsmanager starten.

Ich hatte also die folgende Situation:

  • Agestartet Bmit FLAG_ACTIVITY_CLEAR_TOP, Aendet.
  • Bmöchte einen Dienst neu starten, sendet also den Benutzer, an Aden die Dienstneustartlogik und die Benutzeroberfläche (keine Flags) gesendet werden.
  • Astartet Bmit FLAG_ACTIVITY_CLEAR_TOP, Aendet.

Zu diesem Zeitpunkt wird das zweite FLAG_ACTIVITY_CLEAR_TOPFlag neu gestartet, Bdas sich im Task-Stack befindet. Ich gehe davon aus, dass dies das zerstören Taskund ein neues starten muss , was mein Problem verursacht. Diese Situation ist sehr schwer zu erkennen, wenn Sie mich fragen!

Also, wenn alle meine Vermutungen richtig sind:

  • Der Launchereinzige setzt die ursprünglich erstellte Aufgabe fort
  • FLAG_ACTIVITY_CLEAR_TOPwird, wenn es das einzig verbleibende Activityneu startet , auch ein neues neu erstellenTask
Graeme
quelle
FLAG_ACTIVITY_CLEAR_TOP erstellt keine neue Aufgabe und startet die Aktivität, die Sie starten möchten, nicht neu, wenn dies die einzige verbleibende Aktivität ist. "Wenn festgelegt und die zu startende Aktivität bereits in der aktuellen Aufgabe ausgeführt wird, werden anstelle einer neuen Instanz dieser Aktivität alle anderen darüber liegenden Aktivitäten geschlossen und diese Absicht an die (jetzt) ​​übergeben oben) alte Aktivität als neue Absicht. "
starkej2
2
Mir ist klar, dass dies nicht beabsichtigt ist - aber durch Versuch und Irrtum ist dies in meinem Fall der Fall. Das Entfernen dieser Flags behebt das Problem.
Graeme
Dies führt nicht unter allen Bedingungen zu einem perfekten Lebenslauf auf allen Geräten.
danny117
Das Entfernen der Flags hat das Problem für mich behoben. Danke
Sealer_05
Ich habe ein Begrüßungsbildschirm- / Hauptbildschirmszenario, aber ich verwende keine Flags für den Übergang von Begrüßungs- zu Hauptbildschirm. Dennoch ist das Problem für mich reproduzierbar - diese Lösung funktioniert für mich nicht.
oder
12

Ich hatte das gleiche Problem auf Samsung-Geräten. Nachdem ich viel gesucht hatte, funktionierte keine dieser Antworten für mich. Ich fand, dass in der Datei AndroidManifest.xmllaunchMode auf singleInstance( android:launchMode="singleInstance") gesetzt ist. Das Entfernen des launchModeAttributs hat mein Problem behoben.

Ali
quelle
In der Tat hat dies auch für mich den Trick getan. Ich fand diese Antwort von einer anderen SO-Frage hilfreich: stackoverflow.com/a/21622266/293280 . Und diese Aufschreibung der verschiedenen Arten von launchModeWerten: inthecheesefactory.com/blog/…
Joshua Pinter
Dieser Fix hat bei mir funktioniert! Dies wurde nicht im Manifest, sondern im Aktivitätsattribut über der Hauptaktivitätsklasse hinzugefügt.
Calin
@CalinVlasin Kannst du mir genau zeigen, wie du den launchMode benutzt hast? wo hast du es platziert Derzeit habe ich es so, aber es verursacht das Problem: <Aktivität android: name = ". UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" android: launchMode = "singleTop" android: windowSoftInputMode = "stateAlwaysHidden | adjustResize ">
j2emanue
Das war auch mein Problem. Ich denke, dies sollte in Verbindung mit der akzeptierten Antwort verwendet werden (! IsTaskRoot ...
siehe
1

Auf meinem Cat s60 hatte ich in den Entwickleroptionen "Aktivitäten nicht beibehalten" aktiviert. Durch erneutes Deaktivieren konnte ich Apps wechseln, ohne den Status der Apps zu verlieren ...

ptp
quelle
Keine Ahnung wie, aber das war auf meinem Gerät eingeschaltet.
realPro
0

Diese Lösung hat bei mir funktioniert:

    @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);
    }

Kredit: Ich muss die Android-Anwendung beim Klicken auf die Schaltfläche "Zurück" minimieren

funktioniert möglicherweise nicht auf allen Geräten, erstellt jedoch erfolgreich das Verhalten der Home-Taste, wenn die Zurück-Taste gedrückt wird, wodurch die Aktivität gestoppt und nicht beendet wird.

Russell Chisholm
quelle
Interessanter Trick, löst aber das Problem nicht wie angegeben. Sehr nützlich für andere Probleme / Fragen.
Graeme
Die Schaltfläche "Zurück" hat einen bestimmten Zweck und Benutzer erwarten, dass die Schaltfläche "Zurück" das tut, was sie tun soll. Es in irgendeiner Weise zu überschreiben ist falsch und meiner Meinung nach höchst unprofessionell.
Bugs passieren
-1

Ich hatte das gleiche Problem, die Ursache war:

(Kotlin-Code in MainActivity)

override fun onBackPressed() {
    finish()
}

Wenn ich von meiner LoginActivity zu meiner MainActivity navigiere, verwende ich Folgendes:

    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)

Wenn ich diese Flags verwende, muss in meiner MainActivity kein onBackPressed () vorhanden sein. Die App wird auf natürliche Weise beim Zurückklicken beendet. Und wenn Sie die Home-Taste drücken und zur App zurückkehren, wird der Computer nicht neu gestartet.

Christer
quelle
-2

Lösung für Leute, die keine Ahnung haben, wie sie dieses Problem auf ihrem Android-Handy programmieren und erleben. Dies geschieht hauptsächlich aufgrund eines Upgrades der Android-Version (nur meine Annahme). Nach dem Upgrade werden alle Ihre Apps optimiert, um weniger Akku zu verbrauchen. Dies verlangsamt jedoch Ihr Gerät.

Wie löst man

Gehen Sie zu Einstellungen >> Apps >> Apps-Einstellungen (suchen Sie nach Einstellungszeichen an einer beliebigen Stelle auf dem Bildschirm - es ist auf verschiedenen Geräten unterschiedlich) >> Batterieoptimierung (oder eine ähnliche Option [Bildbeschreibung hier eingeben] [1] ein) >> Verschieben Sie alle Apps in den Status "nicht optimiert" (müssen 1 zu 1 manuell ausgeführt werden - können bei einigen Telefonen zulässig / nicht zulässig sein). Ihre Launcher-App muss "nicht optimiert" sein (Zen UI-Launcher in meinem Fall - dies ist der Schuldige, denke ich - Sie könnten versuchen, eine andere App zu optimieren / nicht zu optimieren und neu zu starten, wenn Sie Zeit haben). Starten Sie jetzt Ihr Telefon neu. (keine Notwendigkeit, Daten / abgesicherten Modus oder irgendwelche Probleme zurückzusetzen)

Versuchen Sie es jetzt mit Multitasking. :) Durch Drücken des Startsymbols sollte nun die aktuelle Aufgabe fortgesetzt werden. :) Ihr Gerät wird zu Keine Sorge, der Akku wird trotzdem entladen.

Arun Antony
quelle
-8

Für Ihre Benutzer von unschätzbarem Wert. Der perfekte Lebenslauf auch nach Sitzungswochen in der kürzlich verwendeten App-Liste.

Es sieht für den Benutzer wie ein Lebenslauf aus, ist aber tatsächlich ein vollständiger Start.

Hintergrund: Der Speicher, der von Apps verwendet wird, die sich in der Hauptaktivität befinden und noch keine Aufgabe gestartet haben, kann leicht zurückgefordert werden. Das Betriebssystem kann die App einfach mit dem an onCreate übergebenen Originalpaket neu starten. Sie können jedoch das ursprüngliche Bundle hinzufügen, onSaveInstanceStatedamit Sie beim Neustart Ihrer App durch das Betriebssystem den Instanzstatus wiederherstellen können und niemand weiß, ob die App neu gestartet oder fortgesetzt wird. Nehmen Sie zum Beispiel das klassische Kartenprogramm. Der Benutzer bewegt sich zu einer Position auf der Karte und drückt dann die Home-Taste. Zwei Wochen später ist diese Mapping-App neben Facebook, Pandora und Candy Crush immer noch in der Liste der neuesten Apps enthalten. Das Betriebssystem speichert nicht nur den Namen der App für die zuletzt verwendeten Apps, sondern auch das ursprüngliche Bundle, das zum Starten der App verwendet wurde. Der Programmierer hat jedoch die codiertonSaveInstanceState Methode, sodass das ursprüngliche Bundle jetzt alle Materialien und Informationen enthält, die zum Erstellen der App erforderlich sind, sodass es so aussieht, als ob sie wieder aufgenommen wurde.

Beispiel: Speichern Sie die aktuelle Kameraposition in onSaveInstanceState, falls die App entladen ist und Wochen später aus der Liste der zuletzt verwendeten Apps neu gestartet werden muss.

@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);
        }

Hinweis: Sie können die onRestoreInstanceStateMethode auch verwenden , aber ich finde es einfacher, die Instanz in wiederherzustellen onCreate.

Dies ist mehr als wahrscheinlich, was in Ihrer App passiert. Auf einigen Geräten wird Ihre App auf freien Speicher entladen. Ja, es gibt einige Flaggen, die helfen, aber die Flaggen nehmen nicht jede Nuance Ihrer App auf und die Flaggen halten Sie nicht wochenlang onSaveInstanceStateam Leben. Sie müssen den perfekten Lebenslauf zwei Wochen später codieren. Für die komplexe App wird es keine leichte Aufgabe sein, aber wir stehen hinter Ihnen und sind hier, um Ihnen zu helfen.

Viel Glück

danny117
quelle
Dies ist nicht auf allgemeine Speicherprobleme oder Standardbedingungen für den Pausenstatus zurückzuführen. Ich habe meine App auf vielen Geräten ausprobiert (einige mit großem Speicher, andere mit geringerem Speicher).
Graeme
Aus diesem Grund speichern Sie persistente Daten in onPause. Ich habe versucht, meine App auf dem Telefon, das ich täglich verwende, bis zu zwei Wochen lang wieder aufzunehmen. Nach zwei Wochen wird die onCreate-Methode aufgerufen und das Betriebssystem wird in dem von mir gespeicherten Bundle übergeben onSaveSessionState und ich verwenden die Daten im Bundle, damit meine Aktivität genau so angezeigt wird, wie ich sie verlassen habe. Es sind also erst drei Tage seit meiner Antwort vergangen, sodass Sie auf keinen Fall einen zweiwöchigen Test hätten absolvieren können. Zusammenfassung: Die App kann jederzeit im Hintergrund heruntergefahren werden.
danny117
@ danny117 Ich glaube nicht, dass Sie das Problem, das Graeme hat, genau verstehen
starkej2
Ich verstehe Graemes Problem. Auf einigen Geräten, auf denen die App fortgesetzt wird, wird onCreate aufgerufen. Klingt genau wie mein HTC EVO (Lebkuchen), das die App töten würde, nur um den Bildschirm zu drehen. Schauen Sie sich die darin enthaltenen Dokumente an, damit die App in onCreate developer.android.com/reference/android/app/…
danny117
@ danny117 das ist richtig, aber das Problem, das er hat, hängt nicht damit zusammen, dass eine einzelne Aktivität neu erstellt wird, wenn die App wieder aufgenommen wird (was erwartet wird), sondern dass die falsche Aktivität gestartet wird
starkej2