C'est un classique de la "chasse aux sorcières" de développement Android. Il y a deux problèmes ici:
- Il y a une subtile Android Cadre d'un bug qui complique grandement application de gestion de la pile au cours du développement, au moins sur les anciennes versions (pas tout à fait sûr si/quand/comment il a été résolu). Je vais discuter de ce bug ci-dessous.
- Le "normal" ou destinés à cet égard, lui, est plutôt compliqué avec la dualité de onPause/onResume et onSaveInstanceState/onRestoreInstanceState
La navigation à travers tous ces fils, je soupçonne que la plupart du temps, les développeurs sont en train de parler à propos de ces deux problèmes en même temps ... d'où la confusion et les rapports de "cela ne fonctionne pas pour moi".
Tout d'abord, pour clarifier le " but " de comportement: onSaveInstance et onRestoreInstance est fragile et passagère de l'état. L'utilisation prévue (afaict) est de gérer les Activités de loisirs lorsque le téléphone est mis en rotation (changement d'orientation). En d'autres termes, l'utilisation prévue est quand votre Activité est toujours logiquement 'en haut', mais encore doit être réintroduit par le système. Le enregistré le Bundle n'est pas conservée en dehors du processus/mémoire/gc, de sorte que vous ne peut pas vraiment compter sur cette si votre activité passe à l'arrière plan. Oui, peut-être que votre Activité du mémoire survivra à son voyage à l'arrière-plan et d'échapper à la GC, mais ce n'est pas fiable (il n'est ni prévisible).
Donc, si vous avez un scénario où il est significatif d'utilisateur "progrès" ou de l'état qui doit être maintenu entre la "lance" de votre application, la direction est d'utiliser onPause et onResume. Vous devez choisir et préparer un magasin permanent vous-même.
MAIS - il y a un très déroutant bug qui complique tout cela. Les détails sont ici:
http://code.google.com/p/android/issues/detail?id=2373
http://code.google.com/p/android/issues/detail?id=5277
En fait, si votre application est lancée avec la SingleTask drapeau, et puis plus tard, vous le lancer à partir de l'écran d'accueil ou le menu du lanceur, alors qu'à la suite de l'invocation va créer une NOUVELLE tâche ... vous allez effectivement avoir deux différentes instances de votre application habiter dans le même stack ... qui est très étrange, très rapide. Cela semble se produire lorsque vous lancez votre application en cours de développement (c'est à dire à partir d'Eclipse ou Intellij), afin que les développeurs de cette beaucoup. Mais aussi à travers certains de l'app store mécanismes de mise à jour (si elle a des effets sur vos utilisateurs).
Je me suis bien battu au travers de ces fils pendant des heures avant de me rendre compte que mon principal problème a été de ce bug, pas l'intention cadre comportement. Un grand writeup et solution de contournement (mise à JOUR: voir ci-dessous) semble être de l'utilisateur @kaciula dans cette réponse:
La clé de la maison de la presse de comportement
Mise à JOUR juin 2013: Mois plus tard, j'ai enfin trouvé la "bonne" solution. Vous n'avez pas besoin de gérer tout stateful startedApp drapeaux vous-même, vous pouvez détecter ce à partir du cadre et de la caution de façon appropriée. J'utilise ce près le début de mon LauncherActivity.onCreate:
if (!isTaskRoot()) {
Intent intent = getIntent();
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
finish();
return;
}
}