Criando serviços AndroidCreating Android Services

Este guia aborda os serviços Xamarin. Android, que são componentes do Android que permitem que o trabalho seja feito sem uma interface do usuário ativa. Os serviços são comumente usados para tarefas que são executadas em segundo plano, como cálculos de tempo demorado, download de arquivos, reprodução de música e assim por diante. Ele explica os diferentes cenários para os quais os serviços são adequados e mostra como implementá-los para executar tarefas em segundo plano de longa execução, bem como para fornecer uma interface para chamadas de procedimento remoto.This guide discusses Xamarin.Android services, which are Android components that allow work to be done without an active user interface. Services are very commonly used for tasks that are performed in the background, such as time consuming calculations, downloading files, playing music, and so on. It explains the different scenarios that services are suited for and shows how to implement them both for performing long-running background tasks as well as for providing an interface for remote procedure calls.

Visão geral dos serviços AndroidAndroid Services Overview

Os aplicativos móveis não são como aplicativos da área de trabalho.Mobile apps are not like desktop apps. As áreas de trabalho têm grandes quantidades de recursos como espaço real da tela, memória, espaço de armazenamento e uma fonte de alimentação conectada, os dispositivos móveis não.Desktops have copious amounts of resources such as screen real estate, memory, storage space, and a connected power supply, mobile devices do not. Essas restrições forçam os aplicativos móveis a se comportarem de forma diferente.These constraints force mobile apps to behave differently. Por exemplo, a tela pequena em um dispositivo móvel normalmente significa que apenas um aplicativo (ou seja, atividade) está visível por vez.For example, the small screen on a mobile device typically means that only one app (i.e. Activity) is visible at a time. Outras atividades são movidas para o plano de fundo e enviadas para um estado suspenso onde não podem executar nenhum trabalho.Other Activities are moved to the background and pushed into a suspended state where they cannot perform any work. No entanto, só porque um aplicativo Android está em segundo plano não significa que é impossível para o aplicativo continuar funcionando.However, just because an Android application is in the background does not mean that it is impossible for app to keep working.

Os aplicativos Android são compostos de pelo menos um dos quatro principais componentes a seguir: atividades, receptores de transmissão, _provedores de conteúdo_e Serviços.Android applications are made up of at least one of the following four primary components: Activities, Broadcast Receivers, Content Providers, and Services. As atividades são a base de muitos aplicativos excelentes do Android, pois fornecem a interface do usuário que permite que um usuários interaja com o aplicativo.Activities are the cornerstone of many great Android applications because they provide the UI that allows a user to interact with the application. No entanto, quando se trata de executar trabalho simultâneo ou em segundo plano, as atividades nem sempre são a melhor opção.However, when it comes to performing concurrent or background work, Activities are not always the best choice.

O mecanismo principal de trabalho em segundo plano no Android é o serviço.The primary mechanism for background work in Android is the service. Um serviço Android é um componente projetado para fazer algum trabalho sem uma interface do usuário.An Android service is a component that is designed to do some work without a user interface. Um serviço pode baixar um arquivo, reproduzir música ou aplicar um filtro a uma imagem.A service might download a file, play music, or apply a filter to an image. Os serviços também podem ser usados para_IPC_(comunicação entre processos) entre aplicativos Android.Services can also be used for interprocess communication (IPC) between Android applications. Por exemplo, um aplicativo Android pode usar o serviço de player de música que é de outro aplicativo ou um aplicativo pode expor dados (como as informações de contato de uma pessoa) para outros aplicativos por meio de um serviço.For example one Android app might use the music player service that is from another app or an app might expose data (such as a person's contact information) to other apps via a service.

Os serviços e sua capacidade de executar trabalho em segundo plano são cruciais para fornecer uma interface de usuário suave e fluida.Services, and their ability to perform background work, are crucial to providing a smooth and fluid user interface. Todos os aplicativos Android têm um thread principal (também conhecido como um thread de interface do usuário) no qual as atividades são executadas.All Android applications have a main thread (also known as a UI thread) on which the Activities are run. Para manter o dispositivo responsivo, o Android deve ser capaz de atualizar a interface do usuário na taxa de 60 quadros por segundo.To keep the device responsive, Android must be able to update the user interface at the rate of 60 frames per second. Se um aplicativo Android executar muito trabalho no thread principal, o Android descartará os quadros, o que, por sua vez, faz com que a interface do usuário pareça Jerky (às vezes chamado de Janky).If an Android app performs too much work on the main thread, then Android will drop frames, which in turn causes the UI to appear jerky (also sometimes referred to as janky). Isso significa que qualquer trabalho realizado no thread da interface do usuário deve ser concluído no período de tempo entre dois quadros, aproximadamente 16 milissegundos (1 segundo a cada 60 quadros).This means that any work performed on the UI thread should complete in the time span between two frames, approximately 16 milliseconds (1 second every 60 frames).

Para resolver essa preocupação, um desenvolvedor pode usar threads em uma atividade para executar algum trabalho que bloqueie a interface do usuário.To address this concern, a developer may use threads in an Activity to perform some work that would block the UI. No entanto, isso pode causar problemas.However, this could cause problems. É muito possível que o Android destrua e recrie as várias instâncias da atividade.It is very possible that Android will destroy and recreate the multiple instances of the Activity. No entanto, o Android não destruirá automaticamente os threads, o que pode resultar em vazamentos de memória.However, Android will not automatically destroy the threads, which could result in memory leaks. Um exemplo primo disso é quando o dispositivo é girado o – Android tentará destruir a instância da atividade e, em seguida, recriar uma nova:A prime example of this is when the device is rotated – Android will try to destroy the instance of the Activity and then recreate a new one:

Quando o dispositivo gira, a instância 1 é destruída e a instância 2 é criada

Esse é um potencial vazamento de memória que – o thread criado pela primeira instância da atividade ainda estará em execução.This is a potential memory leak – the thread created by the first instance of the Activity will still be running. Se o thread tiver uma referência à primeira instância da atividade, isso impedirá que o Android colete o objeto de coleta de lixo.If the thread has a reference to the first instance of the Activity, this will prevent Android from garbage collecting the object. No entanto, a segunda instância da atividade ainda é criada (o que, por sua vez, pode criar um novo thread).However, the second instance of the Activity is still created (which in turn might create a new thread). A rotação do dispositivo várias vezes em uma rápida sucessão pode esgotar toda a RAM e forçar o Android a encerrar todo o aplicativo para recuperar memória.Rotating the device several times in rapid succession may exhaust all the RAM and force Android to terminate the entire application to reclaim memory.

Como regra geral, se o trabalho a ser executado deve sobreviver alémr uma atividade, um serviço deve ser criado para executar esse trabalho.As a rule of thumb, if the work to be performed should outlive an Activity, then a service should be created to perform that work. No entanto, se o trabalho só for aplicável no contexto de uma atividade, a criação de um thread para executar o trabalho poderá ser mais apropriada.However, if the work is only applicable in the context of an Activity, then creating a thread to perform the work might be more appropriate. Por exemplo, criar uma miniatura para uma foto que acabou de ser adicionada a um aplicativo da Galeria de fotos provavelmente ocorreria em um serviço.For example, creating a thumbnail for a photo that was just added to a photo gallery app should probably occur in a service. No entanto, um thread pode ser mais apropriado para reproduzir algumas músicas que só devem ser ouvidos quando uma atividade estiver em primeiro plano.However, a thread might be more appropriate to play some music that should only be heard while an Activity is in the foreground.

O trabalho em segundo plano pode ser dividido em duas classificações amplas:Background work can be broken down into two broad classifications:

  1. Tarefa de longa execução – Isso funciona em andamento até que seja interrompido explicitamente.Long Running Task – This is work that is ongoing until explicitly stopped. Um exemplo de uma tarefa de execução demorada é um aplicativo que transmite música ou que deve monitorar dados coletados de um sensor.An example of a long running task is an app that streams music or that must monitor data collected from a sensor. Essas tarefas devem ser executadas, mesmo que o aplicativo não tenha nenhuma interface do usuário visível.These tasks must run even though the application has no visible user interface.
  2. Tarefas – periódicas (às vezes chamado de trabalho) Uma tarefa periódica é aquela de duração relativamente curta (vários segundos) e é executada em uma agenda (ou seja, uma vez por dia por uma semana ou talvez apenas uma vez nos próximos 60 segundos).Periodic Tasks – (sometimes referred to as a job) A periodic task is one that is of relatively short in duration (several seconds) and is run on a schedule (i.e. once a day for a week or perhaps just once in the next 60 seconds). Um exemplo disso é baixar um arquivo da Internet ou gerar uma miniatura para uma imagem.An example of this is downloading a file from the internet or generating a thumbnail for an image.

Há quatro tipos diferentes de serviços do Android:There are four different types of Android services:

  • Serviço associado – Um serviço associado é um serviço que tem algum outro componente (normalmente uma atividade) associado a ele.Bound Service – A bound service is a service that has some other component (typically an Activity) bound to it. Um serviço associado fornece uma interface que permite que o componente ligado e o serviço interajam entre si.A bound service provides an interface that allows the bound component and the service to interact with each other. Quando não houver mais clientes ligados ao serviço, o Android encerrará o serviço.Once there are no more clients bound to the service, Android will shut the service down.

  • IntentService–Uma IntentService é uma subclasse especializada da Service classe que simplifica a criação e o uso de serviços.IntentService – An IntentService is a specialized subclass of the Service class that simplifies service creation and usage. Um IntentService é destinado a lidar com chamadas autônomas individuais.An IntentService is meant to handle individual autonomous calls. Ao contrário de um serviço, que pode lidar simultaneamente com várias chamadas, um IntentService é mais parecido com um trabalho do processador da fila de trabalho que – é colocado em fila e um IntentService processa cada trabalho, um de cada vez, em um único thread de trabalho.Unlike a service, which can concurrently handle multiple calls, an IntentService is more like a work queue processor – work is queued up and an IntentService processes each job one at a time on a single worker thread. Normalmente, um IntentService não está associado a uma atividade ou a um fragmento.Typically, anIntentService is not bound to an Activity or a Fragment.

  • Serviço iniciado – Um serviço iniciado é um serviço que foi iniciado por algum outro componente do Android (como uma atividade) e é executado continuamente em segundo plano até que algo indique explicitamente o serviço para parar.Started Service – A started service is a service that has been started by some other Android component (such as an Activity) and is run continuously in the background until something explicitly tells the service to stop. Ao contrário de um serviço associado, um serviço iniciado não tem nenhum cliente associado diretamente a ele.Unlike a bound service, a started service does not have any clients directly bound to it. Por esse motivo, é importante criar serviços iniciados para que eles possam ser reiniciados normalmente conforme necessário.For this reason, it is important to design started services so that they may be gracefully restarted as necessary.

  • Serviço híbrido – Um serviço híbrido é um serviço que tem as características de um serviço iniciado e um serviço associado.Hybrid Service – A hybrid service is a service that has the characteristics of a started service and a bound service. Um serviço híbrido pode ser iniciado pelo quando um componente é associado a ele ou pode ser iniciado por algum evento.A hybrid service can be started by when a component binds to it or it may be started by some event. Um componente de cliente pode ou não estar associado ao serviço híbrido.A client component may or may not be bound to the hybrid service. Um serviço híbrido continuará em execução até que seja explicitamente solicitado a parar ou até que não haja mais clientes associados a ele.A hybrid service will keep running until it is explicitly told to stop, or until there are no more clients bound to it.

O tipo de serviço a ser usado depende muito dos requisitos do aplicativo.Which type of service to use is very dependent on application requirements. Como regra prática, um IntentService ou um serviço associado são suficientes para a maioria das tarefas que um aplicativo Android deve executar, portanto, a preferência deve ser dada a um desses dois tipos de serviços.As a rule of thumb, an IntentService or a bound service are sufficient for most tasks that an Android application must perform, so preference should be given to one of those two types of services. Uma IntentService é uma boa opção para tarefas "One-shot", como baixar um arquivo, enquanto um serviço associado seria adequado quando interações frequentes com uma atividade/fragmento forem necessárias.An IntentService is a good choice for "one-shot" tasks, such as downloading a file, while a bound service would be suitable when frequent interactions with an Activity/Fragment is required.

Embora a maioria dos serviços seja executada em segundo plano, há uma subcategoria especial conhecida como serviço de primeiro plano.While most services run in the background, there is a special sub-category known as a foreground service. Esse é um serviço que recebe uma prioridade mais alta (em comparação com um serviço normal) para executar algum trabalho para o usuário (como tocar música).This is a service that is given a higher priority (compared to a normal service) to perform some work for the user (such as playing music).

Também é possível executar um serviço em seu próprio processo no mesmo dispositivo, isso às vezes é chamado de serviço remoto ou como um serviço fora do processo.It is also possible to run a service in its own process on the same device, this is sometimes referred to as a remote service or as an out-of-process service. Isso exige mais esforço para criar, mas pode ser útil para quando um aplicativo precisa compartilhar funcionalidades com outros aplicativos e pode, em alguns casos, melhorar a experiência do usuário de um aplicativo.This does require more effort to create, but can be useful for when an application needs to share functionality with other applications, and can, in some cases, improve the user experience of an application.

Limites de execução em segundo plano no Android 8,0Background Execution Limits in Android 8.0

A partir do Android 8,0 (API nível 26), um aplicativo Android não tem mais a capacidade de ser executado livremente em segundo plano.Starting in Android 8.0 (API level 26), an Android application no longer have the ability to run freely in the background. Quando em primeiro plano, um aplicativo pode iniciar e executar serviços sem restrição.When in the foreground, an app can start and run services without restriction. Quando um aplicativo passa para o segundo plano, o Android concederá ao aplicativo um determinado período de tempo para iniciar e usar os serviços.When an application moves into the background, Android will grant the app a certain amount of time to start and use services. Depois que esse tempo tiver decorrido, o aplicativo não poderá mais iniciar nenhum serviço e todos os serviços que foram iniciados serão encerrados.Once that time has elapsed, the app can no longer start any services and any services that were started will be terminated. Neste ponto, não é possível que o aplicativo execute qualquer trabalho.At this point it is not possible for the app to perform any work. O Android considera um aplicativo em primeiro plano se uma das seguintes condições forem atendidas:Android considers an application to be in the foreground if one of the following conditions are met:

  • Há uma atividade visível (iniciada ou pausada).There is a visible activity (either started or paused).
  • O aplicativo iniciou um serviço em primeiro plano.The app has started a foreground service.
  • Outro aplicativo está em primeiro plano e está usando componentes de um aplicativo que seria, de outra forma, em segundo plano.Another app is in the foreground and is using components from an app that would be otherwise in the background. Um exemplo disso é se o aplicativo A, que está em primeiro plano, está associado a um serviço fornecido pelo aplicativo B. o aplicativo B também seria considerado em primeiro plano e não encerrado pelo Android para estar em segundo plano.An example of this is if Application A, which is in the foreground, is bound to a service provided by Application B. Application B would then also be considered in the foreground, and not terminated by Android for being in the background.

Há algumas situações em que, embora um aplicativo esteja em segundo plano, o Android ativará o aplicativo e relaxará essas restrições por alguns minutos, permitindo que o aplicativo execute algum trabalho:There are some situations where, even though an app is in the background, Android will wake up the app and relax these restrictions for a few minutes, allowing the app to perform some work:

  • Uma mensagem de nuvem firebase de alta prioridade é recebida pelo aplicativo.A high priority Firebase Cloud Message is received by the app.
  • O aplicativo recebe uma difusão.The app receives a broadcast.
  • O aplicativo recebe e executa um PendingIntent em resposta a uma notificação.The application receives and executes a PendingIntent in response to a Notification.

Os aplicativos Xamarin. Android existentes podem precisar alterar a forma como executam trabalho em segundo plano para evitar problemas que possam surgir no Android 8,0.Existing Xamarin.Android applications may have to change how they perform background work to avoid any issues that might arise on Android 8.0. Aqui estão algumas alternativas práticas para um serviço Android:Here are some practical alternatives to an Android service:

  • **Agendar trabalho para ser executado em segundo plano usando o Agendador de trabalhos do Android ou o Dispatcher ** – do trabalho firebase Essas duas bibliotecas fornecem uma estrutura para que os aplicativos segregem o trabalho em segundo plano nos trabalhos, uma unidade discreta de trabalho.Schedule work to run in the background using the Android Job Scheduler or the Firebase Job Dispatcher – These two libraries provide a framework for applications to segregate background work in to jobs, a discrete unit of work. Os aplicativos podem agendar o trabalho com o sistema operacional juntamente com alguns critérios sobre quando o trabalho pode ser executado.Apps can then schedule the job with the operating system along with some criteria about when the job can run.
  • Iniciar o serviço em primeiro plano – um serviço em primeiro plano é útil para quando o aplicativo deve executar alguma tarefa em segundo plano e o usuário pode precisar interagir periodicamente com essa tarefa.Start the service in the foreground – a foreground service is useful for when the app must perform some task in the background and the user may need to periodically interact with that task. O serviço de primeiro plano exibirá uma notificação persistente para que o usuário esteja ciente de que o aplicativo está executando uma tarefa em segundo plano e também fornece uma maneira de monitorar ou interagir com a tarefa.The foreground service will display a persistent notification so that the user is aware that the app is running a background task and also provides a way to monitor or interact with the task. Um exemplo disso seria um aplicativo de podcasting que está reproduzindo um podcast para o usuário ou talvez baixando um episódio de podcast para que possa ser aproveitado posteriormente.An example of this would be a podcasting app that is playing back a podcast to the user or perhaps downloading a podcast episode so that it can be enjoyed later.
  • Usar uma mensagem de nuvem firebase de alta prioridade (FCM) – Quando o Android recebe um FCM de alta prioridade para um aplicativo, ele permitirá que esse aplicativo execute serviços em segundo plano por um curto período de tempo.Use a high priority Firebase Cloud Message (FCM) – When Android receives a high priority FCM for an app, it will allow that app to run services in the background for a short period of time. Essa seria uma boa alternativa para ter um serviço em segundo plano que sonda um aplicativo em segundo plano.This would be a good alternative to having a background service that polls an app in the background.
  • Adiar trabalho para quando o aplicativo entrar no primeiro plano – Se nenhuma das soluções anteriores for viável, os aplicativos deverão desenvolver sua própria maneira de pausar e retomar o trabalho quando o aplicativo chegar ao primeiro plano.Defer work for when the app comes into the foreground – If none of the previous solutions are viable, then apps must develop their own way to pause and resume work when the app comes to the foreground.