onRestart () étant appelé lorsque vous appuyez sur le bouton de retour, comment éviter cela?

StackOverflow https://stackoverflow.com/questions/8390112

  •  28-10-2019
  •  | 
  •  

Question

Mon application appelle quelques services Web lorsqu'elle vient d'être lancée. Je voudrais également appeler ces services Web si l'utilisateur lance l'application (qui fonctionnait en arrière-plan) et reprend. J'ai examiné toutes les méthodes lancées lorsque les applications sont lancées et lorsque les activités sont ciblées. onStart (), onResume (), onRestart () etc ....

Je pensais que le redémarrage serait un bon pari pour passer mes appels de service Web et mettre à jour ma vue, le problème est que si je passe de l'activité A (celle qui fait les appels) à l'activité B et appuie sur le bouton retour, l'activité A se déclenchera onRestart () et appelez les services Web. Je ne veux pas que cela se produise à chaque fois que je retourne à mon écran principal à partir d'une activité dans mon application. Je souhaite que les services ne soient appelés que si l'activité de mon application A est mise en évidence de l'extérieur. Y a-t-il d'autres événements dont je devrais être au courant et qui pourraient m'aider? Si je clique sur le bouton d'accueil, puis sur l'icône de mon application, elle devrait se mettre à jour, mais pas si je clique sur quelque chose sur mon écran principal, j'ouvre une nouvelle activité, puis que je clique sur le bouton retour.

J'espère que la question a du sens.

Merci.

Était-ce utile?

La solution

Selon le Cycle de vie de l'activité , onRestart sera appelé avant onResume.Donc, si vous placez vos appels Web dans onResume, il sera appelé au début de l'activité et à chaque reprise. onRestart n'est appelé que lorsque l'utilisateur revient à cette activité.Ainsi, vous pouvez avoir un booléen dans votre activité (ex. Boolean isActivityRestarting) qui est défini sur false, puis défini sur true dans onRestart.Si c'est vrai lorsque onResume est frappé, alors ne faites pas vos appels Web.

Exemple de code:

public void onRestart() {
    isActivityRestarting = true;
}

public void onResume() {
    if (!isActivityRestarting) {
        executeWebCalls();
    }

    isActivityRestarting = false;
}

Autres conseils

Eh bien, onCreate est votre meilleur choix, mais avec quelques mises en garde. (l'écran principal ici est l'écran qui appelle le webservice)

  • Si l'utilisateur appuie sur le bouton RETOUR sur l'écran principal, onCreate sera appelé.
  • Si l'utilisateur appuie sur le bouton RETOUR sur l'autre écran et revient à l'écran principal, onCreate ne sera pas appelé.
  • Si l'utilisateur quitte l'écran principal en utilisant le bouton ACCUEIL, et revient en appuyant longuement sur le bouton ACCUEIL et en choisissant votre application, onCreate n'est pas appelé.

Jusqu'ici tout va bien, voici le piège.

  • Si l'utilisateur appuie sur le bouton HOME pour quitter puis accède à l'icône du lanceur, le onCreate n'est pas appelé. En théorie, il s'agit d'un comportement cohérent, mais il peut sembler étrange car l'utilisateur peut penser qu'il lance une application depuis le début, oubliant comment il / elle l'a quitté initialement.

Pour vos ans, onCreate est la solution avec de légères vérifications.

Soln si vous utilisez onStart ou onRestart:

Une vérification que vous pouvez faire est de stocker l'horodatage dans vos préférences partagées, ce qui correspond au moment où vous avez appelé les services Web. Maintenant, lorsque l'utilisateur est sorti (que ce soit par la touche ACCUEIL ou RETOUR) et revient, vous pouvez vérifier l'heure et la comparer avec l'heure enregistrée. Si la différence est élevée, faites simplement un appel au service Web. Pour que cela fonctionne, vous devez utiliser onStart ou onRestart.

Puisqu'il s'agit d'un comportement normal (voir http://developer.android.com / reference / android / app / Activity.html # ActivityLifecycle ) Je recommanderais de ne pas essayer de travailler contre elle, mais plutôt de travailler avec les méthodes du cycle de vie.

Votre application est orientée vers l'extérieur, que ce soit à partir de cette autre activité ou autrement.

Peut-être devriez-vous appeler les services dans onCreate?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top