App wird komplett neu gestartet, wenn sie durch Drücken des Symbols im Launcher gestartet wird

79

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.

LayfieldK
quelle
2
Wenn ich also das Gerät neu starte, auf dem ich die App installiere, besteht dieses Problem anscheinend nicht mehr. Nun, das ist cool und alles, aber im Fall meiner App wird es für Benutzer immer noch äußerst ärgerlich sein, wenn es sich vor einem Neustart des Telefons beim Herunterladen so verhält.
LayfieldK
Können Sie eine Stapelverfolgung oder ein Protokoll bereitstellen?
TryTryAgain
2
Nein, es passiert nur, wenn ich eine Release-Version der App verwende, also habe ich kein Stacktrace oder Protokoll.
LayfieldK
3
Ich hatte das gleiche Problem. Haben Sie jemals das Update herausgefunden? oder Ursache? oder sogar in der Lage sein, das Verhalten nach dem Neustart des Geräts neu zu erstellen? - Übrigens habe ich auch festgestellt, dass das
erzwungene
2
Eine gültige Antwort auf dieses Problem finden Sie hier: stackoverflow.com/questions/19545889/…
Mythul

Antworten:

58

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.

Himmel
quelle
3
Dieser Ansatz ist gefährlich, wenn wir dieselbe Aktivität zweimal mit unterschiedlichen Daten öffnen möchten.
Hkaraoglu
6
Wenn Sie dieselbe Aktivität mit unterschiedlichen Daten öffnen möchten, können Sie dies in onNewIntent () behandeln.
Tas
Ich habe auch festgestellt, dass android:launchModees 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 Moment
Joshua Pinter
Hallo, sollte ich allen meinen Aktivitäten den Android hinzufügen: launchMode = "singleTop"?.
Jmarkstar
Das hat in meinem Fall nicht funktioniert. In meiner App habe ich eine Funktion zum Erstellen und Teilen des Links von etwas. Wenn sich die App im Hintergrund befindet und der Benutzer auf den freigegebenen Link klickt, wird eine vollständig neue Instanz der App geöffnet, wenn mein Startmodus auf "singleTop" oder "singleInstance" eingestellt ist.
tech_human
33

Bisher habe ich herausgefunden, dass es sich um ein Problem handelt, das davon abhängt, wie Sie es auf Ihrem realen Gerät installieren, insbesondere:

  1. Wenn Sie die APK einfach kopieren und in den lokalen Speicher Ihres Geräts einfügen und vom Gerät installieren, unabhängig davon, ob sie signiert oder nicht signiert ist oder aus dem Ordner bin stammt, wird dieses Verhalten angezeigt. Die App wird über das Menüsymbol neu gestartet.

Wenn Sie es mit einer der folgenden Optionen installieren, tritt dieses Problem nicht auf:

  1. 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>
    
  2. 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:

  1. Legen Sie android:launchMode="singleTask" = truefür alle Aktivitäten Ihrer App in der Datei AndroidMainifest.xml im Aktivitäts- Tag fest.
  2. 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.

Jayant Arora
quelle
2
Ich würde das nicht empfehlen. launchMode sollte nicht nur eingestellt sein. Es muss einen Zweck haben, da es seltsames Verhalten verursachen kann (aus Erfahrungen heraus sprechen;))
Junge
Wenn Ihre App Funktionen wie Pin Lock unterstützt, sollte sie sorgfältig behandelt werden, wenn Sie Android einstellen möchten: launchMode = "singleTask".
Logan Guo
10

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.

Geben Sie hier die Bildbeschreibung ein

Superuser
quelle
Haben Sie eine Lösung?
Abhay Koradiya
7

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>
Vasanth
quelle
4
 // 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

Fathima km
quelle
3

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.

yak32
quelle
3

Fügen Sie dies zu Ihrer ersten Aktivität hinzu:

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);
Bolling
quelle
2
Dies funktioniert in meinem Fall, in dem es einen Begrüßungsbildschirm gibt, der alle Einstiegspunkte für eine Anwendung verwaltet. Wenn der Begrüßungsbildschirm dies bereits erledigt und beim ersten Mal an den richtigen Ort umgeleitet hat, muss er nicht erneut ausgeführt werden
Ahmed na
2

Versuchen Sie es android:alwaysRetainTaskStatewie 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>
jsnid00
quelle
2

Für mich stellte ich fest, dass ich fälschlicherweise NoHistory = truein 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

Skaterhaz
quelle
1

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

Moven
quelle
1

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.

Amit
quelle
0

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.

Alberto M.
quelle
0

Für mich war das Update das Hinzufügen LaunchMode = LaunchMode.SingleTopmeines 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)]
Calin Vlasin
quelle
-1

Wenn Sie in Android die Zurück-Taste drücken, wird die onDestroyMethode aufgerufen (im Gegensatz zum Drücken der Home-Taste, bei der nur die onPause()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 die onCreate()Methode.

Zoltán
quelle
1
Ich drücke die Home-Taste, um die App zu beenden.
LayfieldK