Un service Android est-il garanti d’appeler onDestroy ()?

Le diagramme de cycle de vie d’une activité sur un Android ne garantit pas que onDestroy () serait appelé, mais que le processus peut être tué et que l’activité est supprimée brutalement. Le diagramme de cycle de vie d’un service sur un Android garantit que onDestroy () serait appelé. J’ai donc deux questions concernant cette différence.

Premièrement, si le service fait partie du même processus que l’activité, le service onDestroy () est-il appelé, bien que l’activité onDestroy () ne soit pas appelée? Je pense que non, car “tuer un processus” suggère que le système d’exploitation arrête ses threads et libère ses ressources.

Et si tel est le cas, un processus de service uniquement peut-il être brusquement tué par le système d’exploitation?

Je ne suis pas sûr de savoir où on est sûr qu’un service est appelé avec onDestroy() . Pour autant que je sache, ce n’est pas le cas. Si vous lisez cette page des documents, elle décrit les conditions dans lesquelles un service peut être supprimé. Donc, si vous demandez si un processus hébergeant à la fois une activité et un service est en train d’être onDestroy() , onDestroy() sera-t-il appelé sur le service (mais pas sur l’activité) alors la réponse est non; onDestroy() un service ne sera pas nécessairement appelé. Quant à savoir si un processus de service uniquement peut être brusquement tué par le système d’exploitation: oui, c’est possible. Cela est particulièrement vrai lorsque vous avez beaucoup de travail à faire et que votre appel à onStartCommand ne met en queue que le travail à effectuer de manière asynchrone. Le service passera alors la majeure partie de son temps non dans les onCreate , onStartCommand ou onDestroy .

Il y a deux choses à considérer:

  1. Android peut décider d’arrêter un processus à un moment donné, lorsque la mémoire est faible et requirejse par d’autres processus plus immédiatement au service de l’utilisateur. Les composants d’application exécutés dans le processus détruit sont par conséquent détruits. Un processus est relancé pour ces composants quand il leur rest du travail à faire. Dans ce cas, onDestroy() n’est pas appelé car Android OS récupérera les ressources de toute façon (c’est la tâche de base du système d’exploitation en général – au cas où vous ne le savez pas).
  2. Un service peut à la fois être démarré et avoir des connexions qui lui sont liées. Dans un tel cas, le système continuera à exécuter le service tant qu’il est démarré ou qu’il existe une ou plusieurs connexions avec l’indicateur Context.BIND_AUTO_CREATE. Une fois qu’aucune de ces situations n’est vérifiée, la méthode onDestroy () du service est appelée et le service est effectivement arrêté. Tous les nettoyages (arrêt des threads, récepteurs de désenregistrement) doivent être terminés à leur retour de onDestroy (). Ainsi, lorsque le système d’exploitation Android voit que le service a terminé son travail et qu’il n’est plus nécessaire, il sera détruit par le système d’exploitation Android. Android OS donne au développeur une chance de libérer les ressources de Service pour ne pas provoquer de fuite de mémoire. Dans ce cas, onDestroy() est appelé car c’est l’endroit où le développeur peut libérer les ressources. Bien sûr, dans ce cas, le processus de candidature rest intact (car il peut y avoir d’autres Services / Activités).