web-dev-qa-db-fra.com

L'application redémarre complètement lorsqu'elle est lancée par l'icône presse dans le lanceur

Je suis en train d'essayer de créer une version finale de ma première application Android à envoyer à quelques testeurs. Cependant, j'ai rencontré un problème avec cela. Lorsque vous quittez l'application, puis que vous y entrez à nouveau en la lançant via son icône, l'application entière redémarre au lieu de revenir à son emplacement précédent. Cela se produit même si vous entrez à nouveau juste après la sortie. Cependant, cela ne se produit pas si je tiens le bouton Accueil et le lance à travers la liste des applications récentes.

J'ai cherché en ligne d'autres personnes ayant ce problème et il y en a quelques-unes, mais personne n'a jamais eu de réponse solide quant à la raison pour laquelle cela leur arrive. Dans de vieilles questions, il était suggéré de définir le mode de lancement sur singletask ou singleinstance dans le fichier manifeste, mais cela ne m'a pas aidé et, d'ailleurs, le comportement par défaut d'Android est de revenir à l'état précédent de la tâche dans cette situation, alors je ne sais pas pourquoi j’aurais besoin d’options spéciales du manifeste pour le faire.

La chose la plus bizarre à propos de ce problème est que si j'utilise Eclipse et le débogueur pour mettre l'application sur mon téléphone, ce problème ne se produit pas. Je n'ai même pas besoin d'être connecté au débogueur, il semble que tant que j'ai une version de débogage de l'application, le problème ne se produit pas. Mais si j'utilise une version de version (je la crée à l'aide de l'option de menu Outils - Exporter un paquet d'application signé dans Eclipse), le problème se produit . Si quelqu'un a une idée de la cause de ce problème, j'aimerais écoutez vos pensées.

54
LayfieldK

J'ai eu le même problème avec une application et j'ai résolu ce problème en ajoutant l'indicateur "Android:launchMode="singleTop"" au lieu de "Android:launchMode="singleTask"" dans la déclaration <activity> de votre fichier AndroidManifest.xml. J'espère que cela aidera quelqu'un.

42
sky

Jusqu'à présent, j'ai découvert qu'il s'agissait d'un problème lié à la manière dont vous l'installez dans votre appareil réel, notamment:

  1. Si vous copiez et collez simplement le fichier APK dans la mémoire de stockage de votre appareil et l'installez à partir de l'appareil, qu'il soit signé ou non signé ou extrait du dossier bin, le comportement suivant apparaît. L'application redémarre à partir de l'icône du menu.

Si vous l'installez à l'aide de l'une des options suivantes, ce problème n'apparaît pas: 

  1. Allez sur sdk/tools/en utilisant un terminal ou une invite de commande, puis tapez

    adb install <FILE PATH OF .APK FILE>
    

    Sous Linux, tapez:

    ./adb install <FILE PATH OF .APK FILE>
    
  2. Exécutez simplement votre projet depuis Eclipse.

Je serais heureux de savoir s’il est possible de distribuer les fichiers APK corrects pour les tests bêta. J'ai déjà essayé d'exporter un fichier APK signé, car lorsque vous copiez et collez un fichier APK et que vous l'installez manuellement, il indique le comportement indésirable.

Mettre à jour:  

J'ai trouvé une solution. Suivez ces deux étapes:

  1. Définissez Android:launchMode="singleTask" = true pour toutes les activités de votre application dans le fichier AndroidMainifest.xml de la balise activity.
  2. Mettez ce code dans la fonction onCreate() de votre activité de lancement.

    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;       
        }
    }
    

Ce comportement est un bug dans Android. Pas un cas particulier.

28
Jayant Arora

Vous pouvez utiliser launchMode en tant que singleTop pour l'activité de lancement dans AndroidManifest.xml.

       <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

C'est le comportement par défaut sous Android. Pour les versions de débogage, cela fonctionne différemment pour une raison quelconque. Pour résoudre ce problème, ajoutez Android:launchMode="singleInstance" à l'activité que vous souhaitez redémarrer après le lancement à partir de l'icône. 

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;
        }

écrivez le code ci-dessus dans votre activité de lancement avant d'appeler setContentView. Cela résoudra le problème

2
Fathima km

Une autre cause étrange, le redémarrage se produit uniquement lorsque l'application a été lancée en cliquant sur "OUVRIR" après l'option Copier vers le périphérique - & - Installer.

Test sur OS8.1, aucun launchMode en activité.

 enter image description here

2
superuser

Essayez d'utiliser Android:alwaysRetainTaskState comme indiqué dans l'exemple suivant:

<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

Ajoutez ceci à votre première activité:

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

Pour moi, le correctif consistait à ajouter LaunchMode = LaunchMode.SingleTop à mon attribut d'activité par rapport à l'activité principale:

/// <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

Lorsque vous appuyez sur le bouton Précédent dans Android, la méthode onDestroy est invoquée (par opposition à l'appui sur le bouton d'accueil, seule la méthode onPause() étant invoquée).

Si vous souhaitez que votre application continue là où elle s'est arrêtée, enregistrez son état dans votre méthode onDestroy() et chargez cet état dans la méthode onCreate().

0
Zoltán

Je vois ce problème sur Android TV en 2019. Existe-t-il une meilleure solution? autre que

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

Cela fonctionne mais ressemble à un bidouillage plus que la solution réelle.

0
Amit

Pour ma part, j’ai constaté que j’avais posté par erreur NoHistory = true dans mon attribut d’activité.

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

Cela empêchait l'application de reprendre cette activité et redémarrait

0
Skaterhaz

Vous pouvez essayer de définir Android:alwaysRetainTaskState="true" pour votre activité de lancement dans AndroidManifest.xml. 

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

Pour plus de détails, vous pouvez voir https://developer.Android.com/guide/topics/manifest/activity-element.html#always

0
Moven

Toutes les solutions ci-dessus ne fonctionnaient pas de manière uniforme sur tous mes appareils. Cela a fonctionné sur certains Samsung mais pas tous.

La cause du problème pour moi était l'installation manuelle de l'APK.

0
Alberto M