"Si vous démarrez un Service android avec startService(..)
, ce Service restera en cours d'exécution jusqu'à ce que vous invoquiez explicitement stopService(..)
. Il existe deux raisons pour lesquelles un service peut être exécuté par le système. Si quelqu'un appelle Context.startService()
, le système récupérera le service (le créera et appellera sa méthode onCreate()
si nécessaire) puis appellera sa méthode onStartCommand(Intent, int, int)
avec les arguments fournis par le client. Le service continuera alors de fonctionner jusqu'à ce que Context.stopService()
ou stopSelf()
soit appelé. Notez que plusieurs appels à Context.startService()
ne s'imbriquent pas (bien qu'ils entraînent plusieurs appels correspondants à onStartCommand()
), donc peu importe le nombre de fois où il est démarré, un service s'arrêtera une fois que Context.stopService()
ou stopSelf()
sera appelé; cependant, les services peuvent utiliser leur méthode stopSelf(int)
pour s'assurer que le service n'est pas arrêté tant que les intents de démarrage n'ont pas été traités.
Les clients peuvent également utiliser Context.bindService()
pour obtenir une connexion persistante à un service. Cela crée également le service s'il n'est pas déjà en cours d'exécution (en appelant onCreate()
onStartCommand(). Le client recevra l'objet IBinder
que le service retourne de sa méthode onBind(Intent)
, permettant au client de faire des appels au service. Le service restera en cours d'exécution aussi longtemps que la connexion est établie (que le client conserve ou non une référence sur le IBinder
du Service). En général, le IBinder
retourné est pour une interface complexe qui a été écrite en AIDL.
Un service peut être à la fois démarré et avoir des connexions liées à lui. Dans un tel cas, le système maintiendra le service en cours d'exécution aussi longtemps qu'il est démarré ou qu'il existe une ou plusieurs connexions vers lui avec le drapeau Context.BIND_AUTO_CREATE
. Une fois que aucune de ces situations ne prévaut, la méthode onDestroy()
du Service est appelée et le service est effectivement terminé. Tous les nettoyages (arrêt des threads, désinscription des récepteurs) doivent être terminés avant de retourner de onDestroy()
."