web-dev-qa-db-fra.com

L'application commence toujours à partir de l'activité racine au lieu de reprendre l'état d'arrière-plan (bogue connue)

Je suis exactement face au problème mentionné dans ces liens:

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

J'ai une activité racine simple avec les intentions LAUNCHER et MAIN et rien d'autre. Je commence une autre activité avec has {aucun indicateur ni rien d’extra) dans le manifeste.

Je lance l'application (activité racine) et à partir de là commence la deuxième activité. En appuyant sur le bouton Home, la tâche passe en arrière-plan. Lors du lancement de l'application à nouveau (depuis Launcher ou en maintenant le bouton Accueil enfoncé pour les applications récentes), une nouvelle instance de l'activité racine est lancée au-dessus de la pile existante.

Si j'appuie sur le bouton Précédent, la nouvelle activité "racine" se ferme et l'ancienne 2ème activité est visible, ce qui signifie qu'elle lance l'activité racine dans la même tâche au lieu de la placer au premier plan.

Pour contrer cela, j'ai lancé le mode singleTask de l'activité racine. Maintenant, lorsque je presse à la maison et lance à nouveau l'application, elle supprime les activités situées au-dessus de l'ancienne tâche racine et fait passer l'ancienne tâche racine au premier plan, au lieu de simplement afficher l'ancienne tâche dans son intégralité avec la 2e activité. Notez que l'ancienne tâche racine conserve son état d'application, ce qui signifie qu'il ne s'agissait pas d'une nouvelle instance, mais que les activités les plus élevées avaient été supprimées.

Cela se produit même sur d'autres applications téléchargées sur le marché. La méthode d'installation manuelle n'a aucun effet pour moi, elle se lance toujours de la même manière.

46
Monstieur

Cela est dû au fait que les intentions utilisées pour démarrer l'application sont différentes. Eclipse démarre une application en utilisant une intention sans action ni catégorie. Le lanceur démarre une application en utilisant une intention avec les actions Android.intent.action.MAIN et Android.intent.category.LAUNCHER. Le programme d'installation démarre une application avec l'action Android.intent.action.MAIN et sans catégorie.

Quiconque a soumis le bogue aurait probablement dû le formuler comme une demande d'amélioration du plug-in Eclipse, car il souhaitait apparemment qu'Eclipse puisse prétendre être le lanceur et lancer des applications avec la même intention que le lanceur.

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

Voici la solution:

@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: J'ai eu des problèmes avec les nouvelles intentions et les notifications. La solution précédente ne fonctionnait pas avec les notifications et les intentions ...

5
toni

Ajoutez simplement ceci à la méthode onCreate de votre activité de lanceur comme ceci:

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

Solution similaire pour 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