Ich bin gerade dabei, eine Release-Version meiner ersten Android-App zu erstellen, die an einige Tester gesendet werden soll. Ich hatte jedoch ein Problem damit. Wenn Sie die App beenden und sie dann erneut aufrufen, indem Sie sie über das entsprechende Symbol starten, wird die gesamte App neu gestartet, anstatt zum vorherigen Speicherort zurückzukehren. Dies tritt auch dann auf, wenn Sie direkt nach dem Beenden erneut eintreten. Es passiert jedoch nicht, wenn ich die Home-Taste gedrückt halte und sie über die Liste der zuletzt verwendeten Apps starte.
Ich habe online nach anderen gesucht, die dieses Problem haben, und es gibt einige, aber niemand hat jemals eine solide Antwort darauf erhalten, warum es ihnen passiert. In alten Fragen wurde vorgeschlagen, den Startmodus in der Manifestdatei auf Singletask oder Singleinstance zu setzen, aber das hat mir nicht geholfen, und außerdem besteht das Standardverhalten für Android - soweit ich weiß - darin, zum vorherigen Status der Aufgabe zurückzukehren In dieser Situation weiß ich nicht, warum ich spezielle Manifestoptionen benötigen würde, um dies zu erreichen.
Das Seltsamste an diesem Problem ist, dass dieses Problem nicht auftritt, wenn ich Eclipse und den Debugger verwende, um die App auf meinem Telefon zu installieren. Ich muss nicht einmal mit dem Debugger verbunden sein. Solange ich eine Debug-Version der App habe, tritt das Problem anscheinend nicht auf. Wenn ich jedoch eine Release-Version verwende (ich erstelle sie mit der Menüoption Android Tools - Signiertes Anwendungspaket exportieren in Eclipse), tritt das Problem auf. Wenn jemand einen Einblick hat, was dies verursacht, würde ich gerne Ihre Gedanken hören.
quelle
Antworten:
Ich hatte das gleiche Problem mit einer Anwendung und habe dieses Verhalten behoben, indem ich ein Flag
"android:launchMode="singleTop""
anstelle"android:launchMode="singleTask""
der<activity>
Deklaration Ihrer AndroidManifest.xml-Datei hinzugefügt habe. Hoffe das wird jemandem helfen.quelle
android:launchMode
es funktioniert , wenn ich nur das Attribut vollständig entferne . Ich bin mir nicht sicher, ob standardmäßig "Standard" verwendet wird, aber Ideen wären hilfreich. Ich habe diese großartige Erklärung gefunden, aber es ist spät, so dass es für mich im MomentBisher habe ich herausgefunden, dass es sich um ein Problem handelt, das davon abhängt, wie Sie es auf Ihrem realen Gerät installieren, insbesondere:
Wenn Sie es mit einer der folgenden Optionen installieren, tritt dieses Problem nicht auf:
Gehen Sie mit einem Terminal oder einer Eingabeaufforderung zu sdk / tools / und geben Sie ein
adb install <FILE PATH OF .APK FILE>
Geben Sie unter Linux Folgendes ein:
./adb install <FILE PATH OF .APK FILE>
Führen Sie Ihr Projekt einfach über Eclipse aus.
Ich würde mich freuen zu wissen, ob es eine Möglichkeit gibt, korrekte APKs für Betatests zu verteilen. Ich habe bereits versucht, eine signierte APK zu exportieren, da beim Kopieren und Einfügen einer APK und bei der manuellen Installation eine unerwünschte Darstellung angezeigt wird.
Aktualisieren:
Ich habe eine Lösung gefunden. Befolgen Sie diese beiden Schritte:
android:launchMode="singleTask" = true
für alle Aktivitäten Ihrer App in der Datei AndroidMainifest.xml im Aktivitäts- Tag fest.Fügen Sie diesen Code in Ihre Launcher-Aktivität ein
onCreate()
.if (!isTaskRoot()) { final Intent intent = getIntent(); final String intentAction = intent.getAction(); if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) { finish(); return; } }
Dieses Verhalten ist ein Fehler in Android. Kein Sonderfall.
quelle
Eine weitere seltsame Ursache ist der Neustart nur, wenn die App durch Klicken auf "ÖFFNEN" nach "Auf Gerät kopieren - & - Installieren" gestartet wurde.
Test unter OS8.1, kein LaunchMode in Aktivität.
quelle
Sie können launchMode als singleTop für die Launcher-Aktivität in AndroidManifest.xml verwenden
<activity android:name="<YOUR_ACTIVITY>" android:label="@string/app_name" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
quelle
// To prevent launching another instance of app on clicking app icon if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN)) { finish(); return; }
Schreiben Sie den obigen Code in Ihre Launcher-Aktivität, bevor Sie setContentView aufrufen. Dies wird das Problem lösen
quelle
Dies ist das Standardverhalten in Android. Bei den Debug-Builds funktioniert dies aus irgendeinem Grund anders. Sie können das Problem beheben
android:launchMode="singleInstance"
, indem Sie der Aktivität hinzufügen , dass Sie nach dem Start über das Symbol einen Neustart durchführen möchten.quelle
Fügen Sie dies zu Ihrer ersten Aktivität hinzu:
if (!isTaskRoot()) { finish(); return; } super.onCreate(savedInstanceState);
quelle
Versuchen Sie es
android:alwaysRetainTaskState
wie im folgenden Beispiel gezeigt:<activity android:name="com.jsnider.timelineplanner.MainActivity" android:alwaysRetainTaskState="true" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
quelle
Für mich stellte ich fest, dass ich fälschlicherweise
NoHistory = true
in meinem Aktivitätsattribut gepostet hatte[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]
Dadurch wurde verhindert, dass die App diese Aktivität wieder aufnahm und neu gestartet wurde
quelle
Sie können versuchen,
android:alwaysRetainTaskState="true"
Ihre Startaktivität in AndroidManifest.xml festzulegen.<activity android:name=".YourMainActivity" android:alwaysRetainTaskState="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Weitere Informationen finden Sie unter https://developer.android.com/guide/topics/manifest/activity-element.html#always
quelle
Ich sehe dieses Problem auf Android TV im Jahr 2019. Gibt es eine bessere Lösung dafür? außer
if (!isTaskRoot()) { finish(); }
Es funktioniert, sieht aber mehr nach einem Hack aus als nach der eigentlichen Lösung.
quelle
Alle oben genannten Lösungen funktionierten nicht auf allen meinen Geräten konsistent. Es funktionierte bei einigen Samsung, aber nicht bei allen.
Die Ursache des Problems war für mich die manuelle Installation des APK.
quelle
Für mich war das Update das Hinzufügen
LaunchMode = LaunchMode.SingleTop
meines Aktivitätsattributs über die Hauptaktivität:/// <summary> /// The main activity of the application. /// </summary> [Activity(Label = "SilhuettePhone", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait, LaunchMode = LaunchMode.SingleTop, WindowSoftInputMode = SoftInput.AdjustResize)]
quelle
Wenn Sie in Android die Zurück-Taste drücken, wird die
onDestroy
Methode aufgerufen (im Gegensatz zum Drücken der Home-Taste, bei der nur dieonPause()
Methode aufgerufen wird).Wenn Ihre App dort fortgesetzt werden soll, wo sie aufgehört hat, speichern Sie den Status der App in Ihrer
onDestroy()
Methode und laden Sie diesen Status in dieonCreate()
Methode.quelle