2010-10-21 30 views
1

Je sais que ma légende de question doit avoir semblé vraiment vague. Mais permettez-moi de le clarifier ici.Combien de temps peut-on passer dans onDestroy() avant que l'activité ne soit détruite?

Dites que j'ai une application android sur une pile middleware. Dans onCreate() de mon activité, j'initialise mes modules middleware.

Dans son onDestroy(), je dois désinitialiser le middleware. Maintenant, mes appels middleware peuvent prendre un certain temps à traiter. Donc, je veux savoir combien de temps la fonction onDestroy() a, et voir si ma désinitialisation peut avoir lieu dans ce délai.

Est-il raisonnable de conserver mon de-init dans onDestroy()?

En outre, supposons que j'initialise le middleware dans onCreate() de l'activité A1. En cliquant sur un bouton, l'activité A1 passe à l'activité A2. Dans des situations de mémoire faible, le LMK va tuer l'activité qui n'a pas été utilisée pendant un certain temps. Dans un tel cas, l'activité A1 ne sera-t-elle pas détruite? Lorsque l'activité A1 est supprimée, toutes les instances que je crée dans A1 sont-elles également désorientées?

Cordialement, kiki

Répondre

4

je crois que vous êtes un peu confus de poser cette question.

Afin d'obtenir une bonne compréhension de ce qui se passe, vous devriez jeter un oeil sur les graphiques du cycle de vie qui se trouve sur developer.android.com:

Vous verrez que Activity.onDestroy() est appelé uniquement dans le cas d'un arrêt contrôlé de l'activité - quelque chose qui arrive extrêmement rarement, car l'OS Android peut tuer votre processus dans une variété de statistiques sans jamais appeler votre méthode onDestroy().

Que devez-vous désinitialiser et pourquoi?

  • Si vous craignez de libérer des ressources, la plupart d'entre elles seront libérées quand/si votre processus est tué.
  • Si vous êtes inquiet au sujet de l'enregistrement des données de l'utilisateur (l'état de votre application), vous devez passer outre onSaveInstanceState() et onRestoreInstanceState()

Si vous voulez vraiment une réponse à votre question, la voici:

  • Pendant qu'il exécute onDestroy(), votre application a (probablement) autant de temps qu'elle le souhaiterait - le fait qu'elle fonctionne encore onDestroy() signifie que le système d'exploitation ne l'a pas sélectionné pour être tué. Mais cela n'aura probablement pas d'importance: pour un, onDestroy ne sera jamais exécuté dans la plupart des applications, et si le système d'exploitation change d'avis et décide que votre application doit mourir, il le supprimera même s'il fonctionne onDestroy.
+1

@jhominal: une petite note indiquant quand sauvegarder les données de l'utilisateur. Il faut savoir que 'onSaveInstanceState()' ne sera appelé que si l'application est en train d'être détruite par le système. Il ne sera pas déclenché si l'application se termine en raison de l'utilisateur appuyant sur le bouton de retour, ou 'finish()' étant appelé dans votre code. Donc, si vous voulez être sûr à 100% que vous sauvegardez l'état actuel de l'application, cela devrait être fait dans 'onPause()'. – Nailuj

+1

Et une autre note: quand vous dites 'votre application a (probablement) autant de temps qu'elle le voudrait', ce n'est pas correct. Si votre application disposait de tout le temps voulu, elle pourrait facilement geler tout le système. Donc, la règle des 5 secondes va toujours. – Nailuj

+0

@Nailuj: L'application s'exécute dans son propre processus Linux. S'il commence à consommer trop de ressources dans la méthode 'onDestroy', (l'utilisateur a déjà quitté l'application), le processus sera tué sans cérémonie par le système - mais la condition pour que cela se produise doit être liée à une quantité de consommé ressources plutôt qu'une durée spécifique. –

3

http://developer.android.com/guide/practices/design/responsiveness.html:

Dans Android, les gardes du système contre applications qui sont insuffisamment sensibles pour une période de temps par affichant une boîte de dialogue à l'utilisateur, appelé l'application ne répond pas (ANR)

La boîte de dialogue ANR apparaît normalement si votre application n'est pas réactive pendant 5 secondes. conds. Comme indiqué par jhominal, la méthode onDestroy() n'est probablement pas là où vous voulez faire vos préférences nettoyage/sauvegarde/etc. Peu importe où vous choisissez de faire cela, que ce soit onDestroy(), onSaveInstanceState() ou onPause(), je crois que la règle générale de 5 secondes s'appliquera. Si ce que vous faites prend plus de 5 secondes, la boîte de dialogue ANR s'affiche et l'utilisateur peut choisir de forcer la fermeture de votre application.

Edit: Si votre application est en arrière-plan, il pourrait être (probablement?) Qu'il est tué directement, sans la boîte de dialogue ANR affiché si vous ne respectez pas les 5 seconde règle. Mais je ne le sais pas à coup sûr, seulement en supposant.