Comunica in background

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

Esistono diverse opzioni per supportare ognuno di questi casi d'uso. Ognuna presenta vantaggi e svantaggi che potrebbero renderla più o meno adatta alle tue esigenze specifiche.

Il seguente diagramma mostra una visualizzazione semplificata delle indicazioni presenti 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 esiste alcuna limitazione all'utilizzo di una di queste API quando l'app non è visibile, ma hanno bisogno 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é un oggetto ScanCallback per ricevere una notifica quando viene analizzato un dispositivo che corrisponde al tuo filtro. (Esempio)
  • Per CompanionDeviceManager: segui le indicazioni descritte nella sezione Mantieni attive le app companion per riattivare l'app e tenerla attiva quando un dispositivo associato in precedenza è nel raggio d'azione. (Esempio)

Collega a un dispositivo

Per connetterti a un dispositivo dopo averlo trovato, devi ottenere un'istanza 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 che passi al valore booleano autoConnect definisce quale delle seguenti due modalità di connessione utilizza il client GATT:

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

In background

Non esistono limitazioni alla connessione a un dispositivo quando l'app è in background, anche se la connessione viene chiusa se il processo viene interrotto. Inoltre, sono previste limitazioni relative all'avvio di attività (su Android 10 e versioni successive) o ai servizi in primo piano (su 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 una volta completata l'attività. Tuttavia, ci sono due casi in cui un'app potrebbe dover mantenere la connessione attiva a tempo indeterminato:

In entrambi i casi, sono disponibili le seguenti opzioni:

Durante il passaggio da un'app all'altra

Trovare un dispositivo, connettersi al dispositivo e trasferire i dati richiede molto tempo e risorse. Per evitare di perdere la connessione e dover eseguire l'intero processo 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 Presenza dispositivo complementare.

Durante l'ascolto di notifiche relative alle periferiche

Per ascoltare le notifiche relative alle periferiche, 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é probabilmente l'app dovrà continuare ad ascoltare per lunghi periodi di tempo. Tuttavia, puoi anche utilizzare un servizio in primo piano.

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