webentwicklung-frage-antwort-db.com.de

Die App wird immer von der Root-Aktivität aus gestartet, anstatt den Hintergrundstatus wieder aufzunehmen (Bekannter Fehler).

Ich habe genau das Problem, das in diesen Links erwähnt wird:

http://code.google.com/p/Android/issues/detail?id=2373

http://groups.google.com/group/Android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/Android-developers/browse_thread/thread/2d88391190be3303?tvc=2

Ich habe eine einfache Wurzelaktivität mit den Absichten LAUNCHER und MAIN und nichts anderes. Ich beginne eine andere Aktivität mit keine Flags oder irgend etwas anderem im Manifest.

Ich starte die App (root-Aktivität) und starte von dort die zweite Aktivität. Beim Drücken der Home-Taste geht die Aufgabe in den Hintergrund. Beim erneuten Starten der App (über Launcher oder durch Halten der Home-Taste für aktuelle Apps) wird eine neue Instanz der Stammaktivität auf dem vorhandenen Stapel gestartet.

Wenn ich die Zurück-Taste drücke, wird die neue "Stammaktivität" geschlossen und die alte zweite Aktivität ist sichtbar. Das bedeutet, dass die Stammaktivität in derselben Aufgabe gestartet wird, anstatt die Aufgabe in den Vordergrund zu bringen.

Um dem entgegenzuwirken, habe ich den Startmodus singleTask der Stammaktivität erstellt. Wenn ich jetzt nach Hause drücke und die App erneut starte, werden die Aktivitäten über der alten Stammaufgabe gelöscht und die alte Stammaufgabe wird in den Vordergrund gestellt, anstatt nur die gesamte alte Aufgabe mit der zweiten Aktivität nach oben zu bringen. Beachten Sie, dass die alte Stammaufgabe immer noch ihren Anwendungsstatus beibehält, was bedeutet, dass es sich nicht um eine neue Instanz handelt, dass jedoch die höheren Aktivitäten beendet wurden.

Es tritt sogar bei anderen Anwendungen auf, die vom Markt heruntergeladen wurden. Die manuelle Installationsmethode hat für mich keine Auswirkung, sie wird trotzdem auf dieselbe Weise gestartet.

46
Monstieur

Dies liegt daran, dass die Absichten zum Starten der App unterschiedlich sind. Eclipse startet eine App mit einer Absicht ohne Aktion und ohne Kategorie. Der Launcher startet eine App mit einer Absicht mit der Aktion Android.intent.action.MAIN und der Kategorie Android.intent.category.LAUNCHER. Das Installationsprogramm startet eine App mit der Aktion Android.intent.action.MAIN und keiner Kategorie.

Wer den Fehler eingereicht hat, sollte ihn wahrscheinlich als Aufforderung zur Verbesserung des Eclipse-Plugins formuliert haben, da Eclipse offenbar die Fähigkeit haben soll, als Launcher zu fungieren und Apps mit derselben Absicht wie der Launcher zu starten.

25
Lance Nanek
    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
        // Activity was brought to front and not created, 
        // Thus finishing this will get us to the last viewed activity 
        finish(); 
        return; 
    } 

    // Regular activity creation code... 
} 
61
Sachin Gurnani

Hier ist die Lösung:

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

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) {
        finish();
        return;
    }

 Your code....
}

EDIT: Ich hatte Probleme mit neuen Absichten und Benachrichtigungen. Die vorherige Lösung funktioniert nicht mit Benachrichtigungen und Absichten ...

5
toni

Fügen Sie dies in der onCreate-Methode Ihrer Starteraktivität wie folgt hinzu:

      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) {
        finish();
        return;
    }
    // other function
    }
1
Amal Kronz

Ähnliche Lösung für Xamarin.Android:

if (!IsTaskRoot)
            {
                string action = this.Intent.Action;
                if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain)
                {
                    Finish();
                    return;
                }
            }
0
CDrosos