Ich habe einen Fehler in meiner Anwendung festgestellt, als sie über die Schaltfläche "Öffnen" in der Google Play Store-App (zuvor Android Market genannt) gestartet wurde . Es scheint, dass das Starten über den Play Store eine andere Verwendung hat Intent
als das Starten über das Anwendungsmenü der Symbole des Telefons. Dies führt dazu, dass mehrere Kopien derselben Aktivität gestartet werden, die miteinander in Konflikt stehen.
Zum Beispiel, wenn meine Anwendung der Aktivitäten ABC besteht, dann kann dieses Problem zu einem Stapel von ABCA führen.
Ich habe versucht, android:launchMode="singleTask"
bei allen Aktivitäten dieses Problem zu beheben, aber es hat den unerwünschten Nebeneffekt, dass der Aktivitätsstapel bei jedem Drücken der HOME-Taste auf root gelöscht wird.
Das erwartete Verhalten ist: ABC -> HOME -> Und wenn die App wiederhergestellt ist, brauche ich: ABC -> HOME -> ABC
Gibt es eine gute Möglichkeit, das Starten mehrerer Aktivitäten desselben Typs zu verhindern, ohne bei Verwendung der HOME-Schaltfläche auf die Stammaktivität zurückzusetzen?
quelle
Antworten:
Fügen Sie dies zu onCreate hinzu und Sie sollten bereit sein:
quelle
finish()
aufgerufen wird, sieht der Benutzer die darunter liegende Aktivität. Aus diesem Grund können Sie davon ausgehen, dass die vorhandene Instanz der App in den Vordergrund gerückt wird. Wenn dies nicht der Fall wäre, hätten Sie mehrere Instanzen der App in separaten Aufgaben, und die zu erstellende Aktivität wäre die Wurzel ihrer Aufgabe.Ich werde nur erklären, warum dies fehlschlägt und wie dieser Fehler programmgesteuert reproduziert werden kann, damit Sie ihn in Ihre Testsuite integrieren können:
Wenn Sie eine App über Eclipse oder Market App starten, wird sie mit Absichtsflags gestartet: FLAG_ACTIVITY_NEW_TASK.
Beim Start über den Launcher (Home) werden die folgenden Flags verwendet: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED und verwendet die Aktion " MAIN " und die Kategorie " LAUNCHER ".
Wenn Sie dies in einem Testfall reproduzieren möchten, führen Sie die folgenden Schritte aus:
Tun Sie dann alles, um zur anderen Aktivität zu gelangen. Für meine Zwecke habe ich gerade eine Schaltfläche platziert, mit der eine andere Aktivität gestartet wird. Gehen Sie dann zurück zum Launcher (nach Hause) mit:
Und simulieren Sie das Starten über den Launcher folgendermaßen:
Wenn Sie die Problemumgehung isTaskRoot () nicht integriert haben, wird das Problem dadurch reproduziert. Wir verwenden dies in unseren automatischen Tests, um sicherzustellen, dass dieser Fehler nie wieder auftritt.
Hoffe das hilft!
quelle
Haben Sie den SingleTop- Startmodus ausprobiert ?
Hier ist einige der Beschreibungen von http://developer.android.com/guide/topics/manifest/activity-element.html :
quelle
Vielleicht ist es dieses Problem ? Oder eine andere Form des gleichen Fehlers?
quelle
Ich denke, die akzeptierte Antwort ( Duane Homick ) hat unbehandelte Fälle:
Sie haben verschiedene Extras (und als Ergebnis App-Duplikate):
Hier ist eine Lösung (SDK_INT> = 11 für Benachrichtigungen), die meiner Meinung nach auch diese Fälle und Statusleistenbenachrichtigungen behandelt.
Manifest :
Launcher-Aktivität :
Service :
Benachrichtigung :
quelle
Mir ist klar, dass die Frage nichts mit Xamarin Android zu tun hat, aber ich wollte etwas posten, da ich es nirgendwo anders gesehen habe.
Um dies in Xamarin Android zu beheben, habe ich den Code von @DuaneHomick verwendet und hinzugefügt
MainActivity.OnCreate()
. Der Unterschied zu Xamarin ist, dass es nachXamarin.Forms.Forms.Init(this, bundle);
und gehen mussLoadApplication(new App());
. SoOnCreate()
würde mein aussehen:* Bearbeiten: Seit Android 6.0 reicht die oben genannte Lösung für bestimmte Situationen nicht aus. Ich habe jetzt auch eingestellt
LaunchMode
aufSingleTask
, die Dinge gemacht zu haben scheint wieder einmal korrekt funktionieren. Ich bin mir jedoch nicht sicher, welche Auswirkungen dies auf andere Dinge haben könnte.quelle
Ich hatte auch dieses Problem
android:configChanges="mcc|mnc"
- wenn Sie haben eine Verbindung zum Mobiltelefon, siehe http://developer.android.com/guide/topics/manifest/activity-element.html#config, welche Konfiguration beim Booten des Systems oder beim Öffnen oder was auch immer vorhanden ist.quelle
Versuchen Sie diese Lösung:
Erstellen Sie eine
Application
Klasse und definieren Sie dort:Dann in Ihrer ersten (Launcher) Aktivität in
onCreate
vorsetContentView(...)
hinzufügen:PS
Controller
ist meineApplication
Klasse.quelle
IS_APP_RUNNING
,true
und Ihre App wird sofort beendet. Nicht etwas, das der Benutzer wahrscheinlich amüsant findet.Ich hatte das gleiche Problem und habe es mit der folgenden Lösung behoben.
Fügen Sie in Ihrer Hauptaktivität diesen Code oben in die
onCreate
Methode ein:Vergessen Sie nicht, diese Berechtigung in Ihr Manifest aufzunehmen.
hoffe es hilft dir
quelle
Versuchen Sie, den SingleInstance- Startmodus mit der Affinität " allowtaskreparenting" zu verwenden. Dadurch wird die Aktivität immer in einer neuen Aufgabe erstellt, aber auch die Reparatur ermöglicht. Überprüfen Sie das Attribut dis: Affinity
quelle
Ich habe einen Weg gefunden, um zu verhindern, dass dieselben Aktivitäten gestartet werden. Dies funktioniert hervorragend für mich
quelle