189 votes

Différence entre onStart() et onResume()

Je n'arrive pas à comprendre le sens de onStart() état de transition. Le site onResume() est toujours appelée après onStart() . Pourquoi ça ne peut pas être le onResume() est invoqué après onRestart() et onCreate() les méthodes excluant simplement onStart() ? Quel est son but ?

Pourquoi ne pouvons-nous pas vivre sans onStart() . Je le considère toujours comme redondant (probablement parce que je ne comprends pas complètement sa signification).

0 votes

Regardez ici pour le cycle de vie de l'application : d.Android.com/guide/topics/fundamentals.html

0 votes

Ce truc est facile. Essayez d'expliquer cela AVEC des fragments, maintenant c'est Programmation Android pour vous !

0 votes

Les réponses ci-dessous n'ont pas le code réel avec l'explication. Ce site est un code qui l'explique avec un fragment.

320voto

Squonk Points 28943

Pourquoi la méthode onResume() n'est-elle pas invoquée après les méthodes onRestart() et onCreate(), à l'exclusion de onStart() ? Quel est son but ?

OK, comme ma première réponse était assez longue, je ne vais pas m'étendre davantage, alors essayons ceci...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

VEUILLEZ NOTER : J'ai délibérément laissé de côté les appels à des choses comme super.onCreate(...) etc. Il s'agit d'un pseudo-code, alors laissez-moi une certaine liberté artistique ;)

Les méthodes de DriveToWorkActivity suivre...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

OK, c'est encore une longue histoire (désolé les amis). Mais voici mon explication...

onResume() c'est quand je commence à conduire et onPause() c'est quand je m'arrête temporairement. Je conduis, puis j'arrive à un feu rouge et je fais une pause... le feu passe au vert et je reprends. Un autre feu rouge et je fais une pause, puis le feu passe au vert et je reprends. Le site onPause() -> onResume() -> onPause() -> onResume() La boucle est serrée et se produit de nombreuses fois au cours de mon voyage.

La boucle entre un arrêt et un redémarrage (pour me préparer à poursuivre mon voyage) et un nouveau départ est peut-être moins courante. Dans un cas, j'ai repéré l'épicerie et l'hôtel de ville. GroceryStoreActivity est lancé (ce qui force mon DriveToWorkActivity au point de onStop() ). Quand je reviens du magasin, je passe par onRestart() et onStart() puis reprendre mon voyage.

Je pourrais mettre le code qui est dans onStart() dans les deux onCreate() et onRestart() et ne pas prendre la peine de remplacer onStart() du tout, mais le plus qui doit être fait entre onCreate() -> onResume() et onRestart() -> onResume() plus je duplique les choses.

Donc, pour reformuler une fois de plus...

Pourquoi la méthode onResume() n'est-elle pas invoquée après les méthodes onRestart() et onCreate(), à l'exclusion de onStart() ?

Si vous ne remplacez pas onStart() alors c'est effectivement ce qui se passe. Bien que le onStart() méthode de Activity sera appelé implicitement, l'effet dans votre code est effectivement onCreate() -> onResume() ou onRestart() -> onResume() .

1 votes

Cela implique que les deux onCreate() et onRestart() partageraient beaucoup de code commun, non ?

1 votes

@Dheeraj : Non, pas nécessairement. Il s'agit d'un pseudo-code destiné à illustrer la manière dont chaque étape du processus de création d'une base de données est réalisée. Activity Le cycle de vie peut être utilisé. La phase de création onCreate(...) peut faire beaucoup lorsqu'il s'agit d'instancier des membres d'instance (éléments d'interface utilisateur, etc.), mais un "redémarrage" ne devrait pas avoir à le faire. En réalité, de nombreux Activities n'ont pas vraiment besoin d'implémenter plus que onCreate(...) , onResume() et onPause() les autres méthodes sont disponibles pour les cas où vous pourriez avoir besoin de faire d'autres choses et la clé est de comprendre où placer le code.

1 votes

C'est pourquoi j'en suis venu à détester l'API Android par rapport à iOS et même WP7... J'ai fait un jeu qui fonctionne sur les trois en C# et je dois dire que je suis très déçu par Google et Android. Ils semblent avoir des lacunes dans le département de conception de langage / API. J'espère vraiment qu'un autre système d'exploitation linux pour téléphone prendra le relais, parce que je vote pour l'Open Source en général...

159voto

Nilesh Pawar Points 1330

Réponse courte :

Nous ne pouvons pas vivre sans onStart car c'est l'état dans lequel l'activité devient "visible" pour l'utilisateur, mais l'utilisateur ne peut pas encore "interagir" avec elle, peut-être parce qu'elle est superposée à un autre petit dialogue. Cette capacité à interagir avec l'utilisateur est ce qui différencie onStart et onResume. Pensez-y comme à une personne derrière une porte vitrée. Vous pouvez voir la personne mais vous ne pouvez pas interagir (parler/écouter/serrer la main) avec elle. OnResume est comme l'ouverture de la porte après laquelle vous pouvez commencer l'interaction.

En outre, la fonction onRestart() est la moins bien comprise. On peut se demander pourquoi ne pas passer directement à onStart() ou onResume() après onStop() au lieu de onRestart(). Cela devient plus facile à comprendre si nous notons que onRestart() est partiellement équivalent à onCreate() si la partie création est omise. En fait, les deux états mènent à onStart() (c'est-à-dire que l'activité devient visible). Ainsi, les deux états doivent "préparer" l'activité à être affichée. OnCreate a la responsabilité supplémentaire de "créer" le contenu à afficher.

Ainsi, leurs structures de code pourraient correspondre à quelque chose comme :

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}

onRestart()
{
     prepareObjectsForDisplay();

}

Toute cette confusion est due au fait que Google a choisi des noms non intuitifs au lieu de quelque chose comme suit :

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Le diagramme d'activité peut être interprété comme suit :

Android Activity Lifecycle

5 votes

Lorsque je l'explique aux étudiants, j'utilise maybeOnInvisible() au lieu de onStop(). Et j'utilise maybeOnDestroy() au lieu de onDestroy(). Je trouve que ces noms fonctionnent bien comme explications. Cependant, je ne voudrais pas que Google adopte ces noms.

0 votes

J'aime vos suggestions de noms, elles aident à faire un peu de sens de cette partie de l'API ridicule d'Android. J'ai encore une question d'ordre général sur le cycle de vie. Dans tous les diagrammes, il y a un chemin qui va de onPause directement à onResume. Je ne pense pas avoir jamais vu ce chemin suivi dans aucun cas. Il emprunte toujours le chemin allant de onStop à onStart. Qu'est-ce qui déclencherait l'autre chemin ?

0 votes

@StephanBranczyk pourquoi utilisez-vous maybe...() ? Pourquoi "peut-être" ?

30voto

Sergey Glotov Points 8390

onStart() appelé lorsque l'activité devient visible pour l'utilisateur. onResume() appelé lorsque l'activité commencera à interagir avec l'utilisateur. Vous pouvez vouloir faire des choses différentes dans ces cas.

Voir ce lien pour référence.

17voto

Jonas Alves Points 735

onResume() s'appelle :

  1. après onStart()
  2. lorsque le Activity passe au premier plan.

De http://developer.Android.com/reference/Android/app/Activity.html#ActivityLifecycle : alt text

10voto

Martin Booka Weser Points 1120

Le livre "Hello, Android, Introducing Google's Mobile Development Platform" donne une bonne explication du cycle de vie des applications Android. Heureusement, le chapitre en question est disponible en ligne sous forme d'extrait. Voir le graphique de la page 39 dans http://media.pragprog.com/titles/eband3/concepts.pdf

Au fait, ce livre est hautement recommandable pour les débutants Android !

2 votes

Belle image et bon livre, mais il ne donne toujours pas de réponse à la question de savoir pourquoi nous avons vraiment besoin de la méthode onStart() et quelles sont les choses spéciales que nous pouvons faire dans cette méthode et que nous ne pouvons pas faire dans onResume().

8 votes

OnStart() n'est PAS appelé, si l'application a été mise en pause. Votre application est "en pause" si une autre application obtient le focus mais ne masque PAS complètement votre application. Vous pouvez donc faire des choses différentes dans l'état "paused" que dans l'état "Stopped". Ainsi, vous pouvez faire des choses différentes si votre application est juste "reprise" à partir de l'état "paused" que si votre application est "démarrée" à partir de l'état "stopped" ou à partir d'un démarrage complet. Cela vous aide-t-il ?

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