Ce qui est important ici, c'est que tout travail intensif pour le CPU ou tout blocage des E/S (y compris l'attente de connexions réseau entrantes) se déroule dans un thread distinct du thread principal de l'interface utilisateur.
Si vous avez simplement besoin que la communication réseau reste en cours pendant que votre activité est en vie, utilisez un second thread au sein de votre activité. Si vous avez besoin de maintenir la communication réseau même après que votre activité ait été tuée, vous devrez utiliser un service.
Gardez à l'esprit que le comportement par défaut est qu'un service partage le même processus et le même thread que toute autre chose dans la même application (y compris l'activité qui fournit votre interface utilisateur). Pour cette raison, même si vous utilisez un service, vous devrez toujours créer un nouveau thread pour obtenir l'effet désiré.
AsyncTask est utilisé pour exécuter une tâche dans un thread séparé qui finira par se terminer et retourner un résultat. Si cela ressemble à votre application, alors n'hésitez pas à l'utiliser. Mais si vous gardez un port ouvert à travers plusieurs requêtes (ce qui signifie que vous n'avez pas une seule valeur de retour), l'utilisation de cette classe serait juste un fardeau.