Comunica in background

Questa guida fornisce una panoramica su come supportare casi d'uso chiave per la comunicazione con i dispositivi periferici quando l'app è in esecuzione in background:

Esistono diverse opzioni per supportare ciascuno di questi casi d'uso. Ognuno ha vantaggi e svantaggi che potrebbero renderlo più o meno adatto alle tue esigenze specifiche.

Il seguente diagramma mostra una visione semplificata delle indicazioni riportate in questa pagina:

Trova un dispositivo

Innanzitutto, l'app deve trovare un dispositivo a cui connettersi. Per trovare un dispositivo BLE, puoi utilizzare una delle seguenti API:

In background

Non ci sono limitazioni all'utilizzo di nessuna di queste API quando l'app non è visibile, ma entrambe richiedono che il processo dell'app sia attivo. Se il processo dell'app non è in esecuzione, puoi utilizzare le seguenti soluzioni alternative:

  • Per BluetoothLeScanner: chiama startScan() con un oggetto PendingIntent anziché con un oggetto ScanCallback per ricevere una notifica quando viene analizzato un dispositivo corrispondente al tuo filtro. (Sample)
  • Per CompanionDeviceManager: segui le indicazioni riportate in Mantenere attive le app complementari per attivare l'app e mantenerla attiva mentre un dispositivo associato in precedenza è nelle vicinanze. (Sample)

Collega a un dispositivo

Per connetterti a un dispositivo dopo averlo trovato, devi ottenere un'istanza di BluetoothDevice per il dispositivo da una delle seguenti origini:

Dopo aver creato un'istanza BluetoothDevice, puoi avviare una richiesta di connessione al dispositivo corrispondente chiamando uno dei metodi connectGatt(). Il valore passato al valore booleano autoConnect definisce quale delle due seguenti modalità di connessione viene utilizzata dal client GATT:

  • Connessione diretta (autoconnect = false): prova a connetterti direttamente al dispositivo periferico e fallisci se il dispositivo non è disponibile. In caso di interruzione della connessione, il client GATT non tenta automaticamente di riconnettersi.
  • Connessione automatica (autoconnect = true): prova a connetterti automaticamente al dispositivo periferico ogni volta che è disponibile. In caso di disconnessione avviata dalla periferica o perché la periferica è fuori portata, il client GATT tenta automaticamente di riconnettersi quando la periferica è disponibile.

In background

Non ci sono limitazioni per la connessione a un dispositivo mentre l'app è in background, anche se la connessione viene chiusa se il processo viene interrotto. Inoltre, esistono limitazioni relative all'avvio di attività (in Android 10 e versioni successive) o di servizi in primo piano (in Android 12 e versioni successive) in background.

Pertanto, per eseguire una connessione in background, le app possono utilizzare le seguenti soluzioni:

Mantenere la connessione a un dispositivo

Idealmente, le app dovrebbero mantenere le connessioni ai dispositivi periferici solo per il tempo necessario e disconnettersi al termine dell'attività. Tuttavia, esistono due casi in cui un'app potrebbe dover mantenere attiva una connessione a tempo indeterminato:

In entrambi i casi, sono disponibili le seguenti opzioni:

Quando passi da un'app all'altra

Trovare un dispositivo, connetterti e trasferire i dati richiede tempo e risorse. Per evitare di perdere la connessione e dover eseguire l'intera procedura ogni volta che l'utente passa da un'app all'altra o esegue attività simultanee, devi mantenere attiva la connessione fino al termine dell'operazione. Puoi utilizzare un servizio in primo piano con il tipo connectedDevice o l'API di presenza del dispositivo companion.

Mentre ascolti le notifiche della periferica

Per ascoltare le notifiche della periferica, l'app deve chiamare setCharacteristicNotification(), ascoltare i callback utilizzando onCharacteristicChanged(), e mantenere attiva la connessione. Per la maggior parte delle app, è meglio supportare questo caso d'uso con CompanionDeviceService perché l'app dovrà probabilmente continuare ad ascoltare per lunghi periodi di tempo. Tuttavia, puoi anche utilizzare un servizio in primo piano.

In entrambi i casi, puoi ricollegarti dopo un processo terminato seguendo le istruzioni nella sezione Connettersi a un dispositivo.