Comunicação em segundo plano

Este guia fornece uma visão geral de como oferecer suporte aos principais casos de uso de comunicação com dispositivos periféricos quando o app estiver sendo executado em segundo plano:

Há várias opções para cada um desses casos de uso. Cada uma tem vantagens e desvantagens que podem torná-las mais ou menos adequadas para suas necessidades específicas.

O diagrama a seguir mostra uma visualização simplificada das orientações nesta página:

Encontre um dispositivo

Primeiro, seu app precisa encontrar um dispositivo para se conectar. Para encontrar um dispositivo BLE, use uma destas APIs:

Em segundo plano

Não há limitação para o uso de qualquer uma dessas APIs enquanto o app não está visível, mas ambas precisam que o processo do app esteja ativo. Se o processo do app não estiver em execução, use estas soluções alternativas:

Conectar a um dispositivo

Para se conectar a um dispositivo depois de encontrá-lo, você precisa acessar uma instância BluetoothDevice para ele usando uma destas fontes:

Quando você tiver uma instância de BluetoothDevice, será possível iniciar uma solicitação de conexão com o dispositivo correspondente chamando um dos métodos connectGatt(). O valor transmitido para o booleano autoConnect define qual dos dois modos de conexão a seguir o cliente GATT usa:

  • Conexão direta (autoconnect = false): tenta se conectar diretamente ao dispositivo periférico e falha se o dispositivo não estiver disponível. Em caso de desconexão, o cliente GATT não tentará se reconectar automaticamente.
  • Conexão automática (autoconnect = true): tente se conectar automaticamente ao dispositivo periférico sempre que ele estiver disponível. No caso de uma desconexão iniciada pelo periférico ou porque o periférico está fora do alcance, o cliente GATT tentará se reconectar automaticamente quando o periférico estiver disponível.

Em segundo plano

Não há restrições para se conectar a um dispositivo enquanto o app está em segundo plano, embora a conexão seja encerrada se o processo for encerrado. Além disso, há restrições para iniciar atividades (no Android 10 e versões mais recentes) ou serviços em primeiro plano (no Android 12 e versões mais recentes) em segundo plano.

Assim, para executar uma conexão em segundo plano, os apps podem usar as seguintes soluções:

Manter a conexão com um dispositivo

O ideal é que os apps mantenham conexões com dispositivos periféricos somente pelo tempo necessário e se desconectem quando a tarefa for concluída. No entanto, há dois casos em que um app pode precisar manter uma conexão ativa indefinidamente:

Em ambos os casos, as seguintes opções estão disponíveis:

Ao alternar entre apps

Encontrar um dispositivo, conectar-se a ele e transferir dados leva tempo e exige muitos recursos. Para evitar a perda de conexão e a necessidade de realizar o processo completo sempre que o usuário alternar entre apps ou realizar tarefas simultâneas, mantenha a conexão ativa até que a operação seja concluída. Você pode usar um serviço em primeiro plano com o tipo connectedDevice ou a API de presença de dispositivo complementar.

Ao ouvir notificações de periféricos

Para detectar notificações de periféricos, o app precisa chamar setCharacteristicNotification(), detectar callbacks usando onCharacteristicChanged() e manter a conexão ativa. Para a maioria dos apps, é melhor oferecer suporte a esse caso de uso com CompanionDeviceService, porque o app provavelmente precisará continuar detectando por longos períodos. No entanto, também é possível usar um serviço em primeiro plano.

Em ambos os casos, é possível se reconectar após um processo encerrado seguindo as instruções na seção Conectar a um dispositivo.