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 Activity
mit der Aktion android.intent.action.MAIN
und 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,
Activity
unabhä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 Activity
sind 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.
quelle
finish()
sie in Fällen aufzurufen , in denen es das ersteActivity
erneut beginnt , anstatt sie wieder aufzunehmen.Antworten:
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:
quelle
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:
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':
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.
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.).
quelle
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,
Activity
oder wenn eineTask
von 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 neueTask
undfinish
eine 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
Task
im 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
:Obwohl es ziemlich offensichtlich ist, dass
FLAG_ACTIVITY_NEW_TASK
ein neues erstellt wirdTask
, 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:Mein Begrüßungsbildschirm startete das "Haupt"
Activity
in meiner App mit dem obigen Flag. Wenn ich meine App "neu gestartet" hätte und dieActivity
noch 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
:Ich hatte also die folgende Situation:
A
gestartetB
mitFLAG_ACTIVITY_CLEAR_TOP
,A
endet.B
möchte einen Dienst neu starten, sendet also den Benutzer, anA
den die Dienstneustartlogik und die Benutzeroberfläche (keine Flags) gesendet werden.A
startetB
mit FLAG_ACTIVITY_CLEAR_TOP,A
endet.Zu diesem Zeitpunkt wird das zweite
FLAG_ACTIVITY_CLEAR_TOP
Flag neu gestartet,B
das sich im Task-Stack befindet. Ich gehe davon aus, dass dies das zerstörenTask
und 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:
Launcher
einzige setzt die ursprünglich erstellte Aufgabe fortFLAG_ACTIVITY_CLEAR_TOP
wird, wenn es das einzig verbleibendeActivity
neu startet , auch ein neues neu erstellenTask
quelle
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.xml
launchMode
aufsingleInstance
(android:launchMode="singleInstance"
) gesetzt ist. Das Entfernen deslaunchMode
Attributs hat mein Problem behoben.quelle
launchMode
Werten: inthecheesefactory.com/blog/…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 ...
quelle
Diese Lösung hat bei mir funktioniert:
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.
quelle
Ich hatte das gleiche Problem, die Ursache war:
(Kotlin-Code in MainActivity)
Wenn ich von meiner LoginActivity zu meiner MainActivity navigiere, verwende ich Folgendes:
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.
quelle
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.
quelle
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,
onSaveInstanceState
damit 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.
Hinweis: Sie können die
onRestoreInstanceState
Methode auch verwenden , aber ich finde es einfacher, die Instanz in wiederherzustellenonCreate
.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
onSaveInstanceState
am 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
quelle