Android onCreate ou onStartCommand pour démarrer le service

105

Habituellement, lorsque je crée un service Android, j'implémente la onCreateméthode, mais dans mon dernier projet, cela ne fonctionne pas. J'ai essayé de mettre en œuvre onStartCommand, et cela semble fonctionner.

La question est: lorsque je dois implémenter un service, quelle méthode est requise? Quelles méthodes dois-je mettre en œuvre? onCreate, onStartCommandou les deux? Et quel est le rôle de chacun?

GVillani82
la source
onCreateest toujours appelé indépendamment
IgorGanapolsky

Réponses:

189

onCreate()est appelée lorsque l' Serviceobjet est instancié (ie: lorsque le service est créé ). Vous devriez faire des choses dans cette méthode que vous ne devez faire qu'une seule fois (c'est-à-dire: initialiser certaines variables, etc.). onCreate()ne sera jamais appelée qu'une seule fois par objet instancié .

Vous n'avez besoin de l'implémenter que onCreate()si vous voulez / devez initialiser quelque chose qu'une seule fois .

onStartCommand()est appelé chaque fois qu'un client démarre le service en utilisant startService(Intent intent). Cela signifie que cela onStartCommand()peut être appelé plusieurs fois. Vous devez faire les choses de cette méthode qui sont nécessaires chaque fois qu'un client demande quelque chose à votre service. Cela dépend beaucoup de ce que fait votre service et de la manière dont il communique avec les clients (et vice-versa).

Si vous ne l'implémentez pas, onStartCommand()vous ne pourrez pas obtenir d'informations de la part Intentdu client onStartCommand()et votre service ne pourra peut-être pas effectuer de travail utile.

David Wasser
la source
6
Deux instances du même service peuvent-elles exister dans une application?
jacktrades
1
@jacktrades Théoriquement et selon la documentation: Non. Cependant, il semble y avoir un bogue dans Android où en effet dans certaines circonstances il créera plusieurs instances d'un service. Cependant, comme je l'ai dit, il s'agit d'un bogue, et nous n'avons pas été en mesure de le reproduire de manière fiable à volonté. Pourquoi demandes-tu?
David Wasser
3
@Mr_and_Mrs_D Aucun bogue officiel n'a été signalé à ma connaissance. Cependant, il y a plusieurs rapports de ce qui se passe et j'ai une application où je sais que cela se produit. Je n'ai pas pu réduire le problème à quelque chose de petit et répétable, donc je n'ai pas signalé de bogue moi-même. La documentation n'indique pas explicitement que les services sont des singletons, mais il est très clair que c'est ce qui est prévu. Regardez la documentation pour 'startService () `: indique clairement que si le service n'est pas déjà en cours d'exécution, il sera créé et démarré, s'il est en cours d'exécution, il reste en cours d'exécution
David Wasser
6
@Diffy Lorsque vous appelez startService(), si le service n'est pas en cours d'exécution, Android créera une instance de la classe de service (il s'agit d'un objet de service) et appellera ensuite onCreate()cet objet. Il appellera alors onStartCommand()cet objet. Si, quelque temps plus tard, vous appelez à nouveau startService(), si le service est toujours en cours d'exécution, Android ne créera pas de nouvel objet de service. Au lieu de cela, il appellera simplement onStartCommand()l'objet de service existant. Est-ce clair?
David Wasser
1
Je t'aime! (y) a fonctionné comme par magie (y) explication très simple et bonne
Hilton Khadka
11

Le service se comporte de la même manière que l'activité Tout ce que vous voulez associateune fois avec un service ira onCreatecomme l'initialisation

et chaque fois que le serviceest appelé à l'aide de startService . onStartCommandsera appelé. et vous pouvez passer n'importe quelle action à effectuer. comme pour un lecteur de musique, vous pouvez jouer, mettre en pause, arrêter d'utiliser l'action

Et vous faites n'importe quoi operation in serviceen envoyant une action et en la recevant suronStartCommand

onCreate travailler comme un constructeur.

Modifier en bref

onCreate()appelle uniquement pour la première fois que vous démarrez un appel ServiceAttendu onStartCommand()chaque fois que vous appelez à startServicenouveau. Il vous permet de définir une action comme lire, arrêter, mettre en pause la musique.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
AndroidGeek
la source
Ainsi, lorsque j'appelle un service en utilisant startService (intent), onCreate () ne sera-t-il pas appelé? J'ai un doute sur ce qu'est un «objet de service» car j'ai toujours démarré un service par startSevice (intention).
Diffy
avez-vous correctement instancié l'objet de service ou vous n'avez probablement pas le service dans votre manifeste
AndroidGeek
démarrer le service comme startService (new Intent (this, ServiceName.class));
AndroidGeek
Mais cette méthode s'appelle-t-elle instanciation du service? Où est alors l'objet de service?
Diffy
c'est une façon d'appeler l'activité et le service en utilisant l'intention est responsable de l'ouverture de l'activité et du service dans Android. Ce que vous voulez faire avec un objet de service, vous pouvez également le faire avec intention. je veux dire passer des données au service
AndroidGeek