it-swarm.com.de

Die App wird vollständig neu gestartet, wenn sie durch Drücken des Symbols im Launcher gestartet wird

Ich versuche gerade, ein Release-Build meiner ersten Android-App zu erstellen, das an ein paar Tester gesendet wird. Ich hatte jedoch ein Problem damit. Wenn Sie die App beenden und sie durch Starten über das Symbol erneut aufrufen, wird die gesamte App neu gestartet, anstatt zum vorherigen Speicherort zurückzukehren. Dies tritt auch dann auf, wenn Sie direkt nach dem Beenden erneut eingeben. 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 gehabt, warum es ihnen passiert. In alten Fragen wurde vorgeschlagen, den Startmodus auf Singletask oder Einzelinstanz in der Manifestdatei zu setzen, was mir aber nicht weitergeholfen hat. Außerdem ist das Standardverhalten von Android, von dem ich weiß, dass es zum vorherigen Zustand der Aufgabe zurückkehrt In dieser Situation weiß ich nicht, warum ich spezielle Manifest-Optionen benötigen würde, um dies zu erreichen.

Das Merkwürdigste an diesem Problem ist, dass dieses Problem nicht auftritt, wenn ich Eclipse und den Debugger verwende, um die App auf meinem Handy zu platzieren. Ich muss nicht einmal mit dem Debugger verbunden sein, es scheint so, als würde das Problem nicht auftreten, solange ich eine Debug-Version der App habe. Wenn ich jedoch eine Release-Version verwende (ich verwende sie mit der Menüoption Android-Tools - Exportieren eines signierten Anwendungspakets in Eclipse), tritt das Problem auf ... Wenn jemand etwas darüber weiß, was dies verursacht, würde ich das gerne tun höre deine Gedanken.

54
LayfieldK

Ich hatte das gleiche Problem mit einer Anwendung und dieses Problem wurde behoben, indem das Flag "Android:launchMode="singleTop"" anstelle von "Android:launchMode="singleTask"" in der <activity>-Deklaration Ihrer AndroidManifest.xml-Datei hinzugefügt wurde. Hoffe das hilft jemandem.

42
sky

Bisher habe ich herausgefunden, dass es sich um ein Problem handelt, das auf der Installation auf Ihrem realen Gerät basiert, insbesondere:

  1. Wenn Sie einfach den APK kopieren und in den lokalen Speicher Ihres Geräts einfügen und ihn vom Gerät installieren, unabhängig davon, ob er signiert oder unsigniert ist oder aus dem Ordner bin, zeigt dies dieses Verhalten an.

Wenn Sie es mit einer der folgenden Optionen installieren, wird Dieses Problem nicht angezeigt: 

  1. Wechseln Sie mit einem Terminal zu sdk/tools /, oder geben Sie die Eingabeaufforderung ein. Geben Sie dann 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 einfach Ihr Projekt von Eclipse aus.

Ich würde mich freuen zu erfahren, ob es eine Möglichkeit gibt, korrekte APKs für Betatests zu verteilen. Ich habe bereits versucht, ein signiertes APK zu exportieren, denn wenn Sie ein APK kopieren und einfügen und es manuell installieren, zeigt es das Rogue-Verhalten.

Update:  

Ich habe eine Lösung gefunden. Befolgen Sie diese zwei Schritte:

  1. Legen Sie Android:launchMode="singleTask" = true für alle Aktivitäten Ihrer App im AndroidMainifest.xml im activity -Tag fest.
  2. Geben Sie diesen Code in die onCreate() Ihrer Launcher-Aktivität ein.

    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.

28
Jayant Arora

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>
6
vasanth

Dies ist das Standardverhalten in Android. Für die Debug-Builds funktioniert es aus irgendeinem Grund anders. Sie können dies beheben, indem Sie Android:launchMode="singleInstance" zu der Aktivität hinzufügen, die Sie nach dem Start über das Symbol neu starten möchten. 

3
yak32
 // 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 löst das Problem

2
Fathima km

Eine weitere merkwürdige Ursache: Der Neustart erfolgt nur, wenn die App durch Anklicken von "OPEN" nach "Copy-to-Device - & - Install" gestartet wurde.

Test unter OS8.1, kein Startmodus in Aktivität.

 enter image description here

2
superuser

Versuchen Sie es mit 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>
1
jsnid00

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

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);
0
Bolling

Für mich bestand das Update darin, LaunchMode = LaunchMode.SingleTop über die Hauptaktivität zu meinem Aktivitätsattribut hinzuzufügen:

/// <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)]
0
adSad

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 die onPause()-Methode aufgerufen wird).

Wenn Sie Ihre App dort fortsetzen möchten, wo sie aufgehört hat, speichern Sie den Status der App in Ihrer onDestroy()-Methode, und laden Sie diesen Status in der onCreate()-Methode.

0
Zoltán

Ich sehe dieses Problem 2019 auf Android TV. Gibt es eine bessere Lösung dafür? außer

if (!isTaskRoot()) {
    finish();
}

Es funktioniert, sieht aber eher nach Hack aus als nach der eigentlichen Lösung.

0
Amit

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 aufnimmt und neu gestartet wird

0
Skaterhaz

Sie können versuchen, Android:alwaysRetainTaskState="true" für Ihre Starteraktivitä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>

Einzelheiten finden Sie unter https://developer.Android.com/guide/topics/manifest/activity-element.html#always .

0
Moven

Alle oben genannten Lösungen funktionierten nicht auf allen meinen Geräten. Bei einigen Samsung hat es funktioniert, aber nicht bei allen.

Die Ursache des Problems bestand für mich darin, die APK manuell zu installieren.

0
Alberto M