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:
BluetoothLeScanner
come descritto in Trovare dispositivi BLE. (Sample)CompanionDeviceManager
come descritto in Accoppiamento del dispositivo complementare. (Sample)
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
: chiamastartScan()
con un oggettoPendingIntent
anziché con un oggettoScanCallback
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:
- Un risultato della ricerca
BluetoothLeScanner
come descritto nella sezione precedente. - L'elenco dei dispositivi accoppiati recuperato da
BluetoothAdapter.getBondedDevices()
. - La cache
BluetoothAdapter
, che utilizzaBluetoothAdapter.getRemoteLeDevice()
.
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:
- Utilizza WorkManager per connetterti al tuo dispositivo.
- Puoi impostare un
PeriodicWorkRequest
o unOneTimeWorkRequest
per eseguire un'azione definita, anche se potrebbero essere applicate limitazioni per le app. - Inoltre, puoi usufruire delle funzionalità di WorkManager, come le limitazioni dei lavori, il lavoro accelerato, le norme di ripetizione e altro ancora.
- Se la connessione deve essere mantenuta attiva il più a lungo possibile per eseguire un'attività, ad esempio la sincronizzazione dei dati o l'polling dai dispositivi periferici, devi avviare un servizio in primo piano seguendo le indicazioni riportate in Supporto per i worker a esecuzione prolungata. Tuttavia, le limitazioni di avvio dei servizi in primo piano si applicano a partire da Android 12.
- Puoi impostare un
- Avvia un servizio in primo piano con il tipo
connectedDevice
.- Se la connessione deve essere mantenuta attiva il più a lungo possibile per eseguire un'attività, ad esempio la sincronizzazione dei dati o l'polling dai dispositivi periferici, devi avviare un servizio in primo piano seguendo le indicazioni riportate in Supporto per i worker a esecuzione prolungata. Tuttavia, le limitazioni di avvio dei servizi in primo piano si applicano a partire da Android 12.
- Chiama
startScan()
con un oggettoPendingIntent
come descritto in Trovare un dispositivo per riattivare il processo quando il dispositivo è presente. Il dispositivo periferico deve essere in modalità di pubblicità.- Ti consigliamo di avviare un worker e un job. Questa operazione potrebbe essere interrotta dal sistema e, pertanto, può supportare solo comunicazioni di breve durata.
- Nelle versioni precedenti ad Android 12 puoi avviare un servizio in primo piano direttamente dall'oggetto
PendingIntent
.
- Utilizza
CompanionDeviceService
e una delle autorizzazioniREQUEST_COMPANION_RUN_IN_BACKGROUND
oREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
per avviare il servizio in background.
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:
- Utilizza
CompanionDeviceService
con l'autorizzazioneREQUEST_COMPANION_RUN_IN_BACKGROUND
e il metodoCompanionDeviceManager.startObservingDevicePresence()
. - Avvia un servizio in primo piano mentre
l'app è in primo piano (o in una delle
esenzioni)
con il
connectedDevice
tipo di primo piano.
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.