Je suis nouveau dans le développement de Android et je ne comprends toujours pas les méthodes onPause()
et onStop()
dans une activité.
Dans mon application, j'ai une classe statique que je nomme Counter, et elle conserve l'état des variables en mémoire pour l'application. Mon application fonctionne bien dans l'émulateur. Ce que j'essayais de tester était le comportement différentiel de onPause()
par rapport à onStop()
.
Pour onPause
, je voulais que les valeurs stockées dans les membres de la classe Counter soient conservées, tandis qu'en appelant onStop()
je voulais que les valeurs du compteur soient remises à zéro. J'ai donc outrepassé onStop()
et défini les variables à l'intérieur de la classe counter à zéro. Cependant, dans l'émulateur, je n'arrive pas à mettre l'application en pause. Dans l'émulateur, j'ouvre mon application, je l'exerce. Ensuite, j'ai appuyé sur le bouton d'accueil (pas sur le bouton retour) de l'émulateur, et j'ai lancé une autre application, pensant que cela imiterait l'activité de onPause()
. Cependant, l'émulateur ne semble pas honorer cela (j'utilise un émulateur armeabi v7a), il semble toujours appeler onStop()
parce que mes valeurs de compteur reviennent toutes à zéro, par ma substitution dans onStop()
. Est-ce inhérent à l'émulateur ou est-ce que je fais quelque chose de mal pour mettre mon activité en pause?
Je ne sais pas avec quel émulateur vous testez, mais onPause
est la seule méthode qui est toujours garantie d'être appelée lorsque votre Activity
perd le focus (et je dites toujours parce que sur certains appareils, en particulier ceux qui exécutent Android 3.2+, onStop
n'est pas toujours garanti d'être appelé avant le Activity
est détruit).
Une bonne façon de comprendre le cycle de vie de Activity
pour les débutants est de jeter vos méthodes remplacées avec Log
s. Par exemple:
public class SampleActivity extends Activity {
/**
* A string constant to use in calls to the "log" methods. Its
* value is often given by the name of the class, as this will
* allow you to easily determine where log methods are coming
* from when you analyze your logcat output.
*/
private static final String TAG = "SampleActivity";
/**
* Toggle this boolean constant's value to turn on/off logging
* within the class.
*/
private static final boolean VERBOSE = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (VERBOSE) Log.v(TAG, "+++ ON CREATE +++");
}
@Override
public void onStart() {
super.onStart();
if (VERBOSE) Log.v(TAG, "++ ON START ++");
}
@Override
public void onResume() {
super.onResume();
if (VERBOSE) Log.v(TAG, "+ ON RESUME +");
}
@Override
public void onPause() {
super.onPause();
if (VERBOSE) Log.v(TAG, "- ON PAUSE -");
}
@Override
public void onStop() {
super.onStop();
if (VERBOSE) Log.v(TAG, "-- ON STOP --");
}
@Override
public void onDestroy() {
super.onDestroy();
if (VERBOSE) Log.v(TAG, "- ON DESTROY -");
}
}
Les différences entre l'appel de onPause () et onStop () peuvent être assez subtiles. Cependant, comme expliqué ici , onPause () sera généralement exécuté lorsqu'une autre activité prend le focus (peut-être sous forme de pop-up, ou fenêtre transparente) pendant que l'activité en cours est toujours en cours. Si vous vous éloignez complètement de l'application (par exemple, en appuyant sur le bouton d'accueil), l'activité n'est plus visible et le système peut exécuter onStop (). Je dis seulement mai parce que, comme Alex l'a mentionné, il y a des cas où onStop n'est pas appelé avant que l'activité ne soit détruite.
onPause ():
"Si une activité a perdu le focus mais est toujours visible (c'est-à-dire qu'une nouvelle activité non complète ou transparente a le focus sur votre activité), elle est suspendue. Une activité suspendue est complètement vivante (elle conserve tous les états et informations sur les membres et reste attaché au gestionnaire de fenêtres), mais peut être tué par le système dans des situations de mémoire extrêmement faible. "
onStop ():
"Si une activité est complètement masquée par une autre activité, elle est arrêtée. Elle conserve toujours toutes les informations d'état et de membre, cependant, elle n'est plus visible pour l'utilisateur, donc sa fenêtre est masquée et elle sera souvent tuée par le système lorsque la mémoire est nécessaire ailleurs. "
Tiré de Android classe d'activité de référence: http://developer.Android.com/reference/Android/app/Activity.html
Je suis d'accord avec milter!
onPause ():
"Si une activité a perdu le focus mais est toujours visible (c'est-à-dire qu'une nouvelle activité non complète ou transparente a le focus sur votre activité), elle est suspendue. Une activité suspendue est complètement vivante (elle conserve tous les états et informations sur les membres et reste attaché au gestionnaire de fenêtres), mais peut être tué par le système dans des situations de mémoire extrêmement faible. "
Si vous échangez des applications sans appuyer sur Retour (maintenez la touche HOME enfoncée), le système d'exploitation va appeler onPause. Lorsque vous revenez à votre activité (appuyez et maintenez à nouveau HOME) dans onResume, toutes vos variables privées devraient être préservées. Mais vous ne pouvez pas contrôler l'utilisateur, non?!
si vous prévoyez que l'utilisateur va quitter votre application et que le système d'exploitation appelle votre onStop, vous feriez mieux de sauvegarder vos données si vous avez l'intention de reprendre là où vous vous étiez arrêté.
J'ai également un minuteur, je dois enregistrer le temps écoulé, donc lorsque l'utilisateur revient, je peux restaurer les données. voici mon exemple pour sauver:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putLong("elapsedTime", elapsedTime);
// etc.
}
Et mon code à restaurer:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
elapsedTime = savedInstanceState.getLong("elapsedTime");
}
Placez ces méthodes dans votre classe et vous êtes prêt à partir. Gardez à l'esprit que la chaîne "elapsedTime" dans mon cas est une CLÉ du système et elle doit être unique. Utilisez des chaînes uniques pour chaque élément de données que vous souhaitez enregistrer. Par exemple "startClock", "ClockTextColor", etc ...
Si vous émulez Android 4.x, vous pouvez contrôler la façon dont le système gère les activités en arrière-plan en utilisant Paramètres -> Options pour les développeurs -> Ne pas conserver les activités et la limite du processus en arrière-plan. Pour les anciennes versions, il existe un application appelée Dev Tools qui contient les mêmes paramètres. Cependant, en cas de mémoire insuffisante, le système peut ignorer ces paramètres et terminer votre application. L'augmentation de la quantité de mémoire attribuée à l'émulateur peut être utile.
De plus, si vous relancez votre application depuis Eclipse, elle tuera le processus précédent au lieu de le terminer avec élégance.