Comparação de um Serviço local de classe base em processo ✱ com um AsyncTask:
This (Esta resposta não aborda serviços exportados ou qualquer serviço executado em um processo diferente do do cliente, pois os casos de uso esperados diferem substancialmente daqueles de um AsyncTask. Além disso, por uma questão de brevidade, a natureza de certos serviços especializados Servicesubclasses (por exemplo, IntentService, JobService) será ignorada aqui.)
Duração do processo
A Servicerepresenta, para o sistema operacional, "o desejo de um aplicativo de executar uma operação de execução mais longa sem interagir com o usuário" [ ref ].
Enquanto você está em Serviceexecução, o Android entende que você não quer que seu processo seja morto. Isso também é verdade sempre que você tem uma Activitytela e é especialmente verdade quando você está executando um serviço em primeiro plano . (Quando todos os componentes do seu aplicativo desaparecem, o Android pensa: "Ah, agora é um bom momento para encerrar este aplicativo, para que eu possa liberar recursos".)
Além disso, dependendo do último valor de retorno de Service.onCreate(), o Android pode tentar "reviver" aplicativos / serviços que foram eliminados devido à pressão do recurso [ ref ].
AsyncTasksnão faça nada disso. Não importa quantos threads de segundo plano você esteja executando ou o quanto eles estão trabalhando: o Android não manterá seu aplicativo ativo apenas porque ele está usando a CPU. É necessário que você saiba que seu aplicativo ainda tem trabalho a fazer; é por isso que Servicessão registrados no sistema operacional e AsyncTasksnão são.
Multithreading
AsyncTasks trata-se de criar um encadeamento em segundo plano no qual executar o trabalho e, em seguida, apresentar o resultado desse trabalho ao encadeamento da interface do usuário de maneira segura.
Cada nova AsyncTaskexecução geralmente resulta em mais simultaneidade (mais threads), sujeita às limitações do AsyncTasks'spool de threads [ ref ].
Servicemétodos, por outro lado, sempre são chamados no thread da interface do usuário [ ref ]. Isso se aplica a onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), etc. Então, em certo sentido, Servicesnão "run" no fundo. Depois que eles iniciam ( onCreate()), eles meio que ficam "sentados" lá - até a hora de limpar, executar um onStartCommand()etc.
Em outras palavras, adicionar mais Servicesnão resulta em mais simultaneidade. Os métodos de serviço não são um bom lugar para realizar grandes quantidades de trabalho, porque são executados no encadeamento da interface do usuário .
Obviamente, você pode estender Service, adicionar seus próprios métodos e chamá-los de qualquer thread que desejar. Mas se você fizer isso, a responsabilidade pela segurança do encadeamento ficará com você - e não a estrutura.
Se você deseja adicionar um encadeamento em segundo plano (ou algum outro tipo de trabalho) ao seu Service, você pode fazê-lo. Você pode iniciar um thread / AsyncTaskin de segundo plano Service.onCreate(), por exemplo. Mas nem todos os casos de uso exigem isso. Por exemplo:
- Você pode manter uma
Servicecorrida para poder continuar recebendo atualizações de localização em "segundo plano" (ou seja, sem necessariamente ter nenhuma Activitiestela).
- Ou então, você pode manter seu aplicativo ativo apenas para manter um "implícito"
BroadcastReceiverregistrado a longo prazo (após a API 26, você nem sempre pode fazer isso através do manifesto, portanto, é necessário se registrar no tempo de execução [ ref ]).
Nenhum desses casos de uso requer muita atividade da CPU; eles apenas exigem que o aplicativo não seja morto .
Como Trabalhadores
Servicesnão são orientados a tarefas. Eles não estão configurados para "executar uma tarefa" e "entregar um resultado", como AsyncTaskssão. Servicesnão resolva nenhum problema de segurança do encadeamento (apesar de todos os métodos serem executados em um único encadeamento). AsyncTasks, por outro lado, lide com essa complexidade para você.
Observe que AsyncTaskestá programado para descontinuação . Mas isso não significa que você deve substituir o seu AsyncTaskspor Services! (Se você aprendeu alguma coisa com esta resposta, isso deve ficar claro.)
TL; DR
Servicesexistem principalmente para "existir". Eles são como uma tela fora da tela Activity, fornecendo uma razão para o aplicativo permanecer vivo, enquanto outros componentes se encarregam de fazer o "trabalho". AsyncTasks"trabalha", mas eles não manterão, por si só, um processo vivo.