222 votes

L'application redémarre plutôt que de reprendre.

Hopefully someone can help me figure out, if not a solution, at least an explanation for a behaviour.

Le Problème :

Sur certains appareils, en appuyant sur l'icône du lanceur, la tâche en cours est reprise, sur d'autres, cela entraîne le lancement de l'intention de lancement initiale (redémarrage de l'application). Pourquoi cela se produit-il ?

Le Détail :

Lorsque vous appuyez sur l'icône du "Lanceur", l'application démarre normalement - c'est-à-dire, je suppose, qu'une intention est lancée avec le nom de votre première Activity avec l'action android.intent.action.MAIN et la catégorie android.intent.category.LAUNCHER. Cela ne peut cependant pas toujours être le cas :

Sur la majorité des appareils, si vous appuyez sur l'icône du lanceur après que l'application est déjà en cours d'exécution, l'activité en cours d'exécution dans ce processus est reprise (PAS l'activité initiale). Elle reprend de la même manière que si vous l'aviez sélectionnée dans les "Tâches récentes" dans le menu du système d'exploitation. C'est le comportement que je veux sur tous les appareils.

Cependant, sur certains autres appareils, un comportement différent se produit :

  • Sur le Motorola Xoom, lorsque vous appuyez sur l'icône du lanceur, l'application démarrera toujours l'activité de lancement initiale, peu importe ce qui est en cours d'exécution. Je suppose que les icônes de lancement démarrent toujours l'intention "LAUNCHER".

  • Sur le Samsung Tab 2, lorsque vous appuyez sur l'icône du lanceur, si vous venez d'installer l'application, elle lancera toujours l'activité initiale (identique au Xoom) - cependant, après avoir redémarré l'appareil après l'installation, l'icône du lanceur reprendra l'application. Je suppose que ces appareils ajoutent les "applications installées" dans une table de recherche au démarrage de l'appareil, ce qui permet aux icônes du lanceur de reprendre correctement les tâches en cours d'exécution ?

J'ai lu de nombreuses réponses qui semblent similaires à mon problème mais simplement ajouter android:alwaysRetainTaskState="true" ou utiliser launchMode="singleTop" pour l'Activity ne sont pas la réponse.

Éditer :

Après le dernier lancement de cette application, nous constatons que ce comportement a commencé à se produire sur tous les appareils après le premier redémarrage. Ce qui me semble fou mais en examinant le processus de redémarrage, je ne trouve pas ce qui ne va pas.

-8voto

danny117 Points 1978

Précieux pour vos utilisateurs. Le CV parfait même après être resté des semaines dans la liste des applications récemment utilisées.

Il semble être un CV pour l'utilisateur mais en réalité c'est un démarrage complet.

Contexte: La mémoire utilisée par les applications qui sont dans l'activité principale mais n'ont pas démarré une tâche est facile à récupérer. Le système d'exploitation peut simplement redémarrer l'application avec le bundle original passé à onCreate. Cependant, vous pouvez ajouter au bundle original dans onSaveInstanceState afin que lorsque votre application est redémarrée par le système d'exploitation, vous puissiez restaurer l'état de l'instance et personne ne saura si l'application a été redémarrée ou reprise. Prenons par exemple le programme de carte classique. L'utilisateur se déplace sur une position sur la carte puis appuie sur la touche Accueil. Deux semaines plus tard, cette application de cartographie est toujours dans la liste des applications récemment utilisées aux côtés de Facebook, Pandora et Candy Crush. Le système d'exploitation ne se contente pas de sauvegarder le nom de l'application pour les applications récemment utilisées, il sauvegarde également le bundle original utilisé pour démarrer l'application. Cependant, le programmeur a codé la méthode onSaveInstanceState de telle sorte que le bundle original contient désormais tous les éléments et informations nécessaires pour construire l'application de sorte qu'elle semble être reprise.

Exemple: Sauvegardez la position actuelle de la caméra dans onSaveInstanceState au cas où l'application serait déchargée et devrait être redémarrée des semaines plus tard depuis la liste des applications récemment utilisées.

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // sauvegarder la position actuelle de la caméra;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }

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

        // obtenir la position exacte de la caméra si l'application a été déchargée.
        if (savedInstanceState != null) {
            // obtenir la position actuelle de la caméra;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

Remarque: vous pouvez également utiliser la méthode onRestoreInstanceState mais je trouve plus facile de restaurer l'instance dans onCreate.

C'est probablement ce qui se passe dans votre application. Sur certains appareils, votre application est déchargée pour libérer de la mémoire. Oui, il y a quelques drapeaux qui aident mais les drapeaux ne captureront pas chaque subtilité de votre application et les drapeaux ne vous maintiendront pas en vie pendant des semaines comme le fera onSaveInstanceState. Vous devez coder la parfaite reprise deux semaines plus tard. Ce ne sera pas une tâche facile pour l'application complexe mais nous sommes derrière vous et sommes là pour aider.

Bonne chance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X