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:
BluetoothLeScanner
, come descritto nella sezione Trovare dispositivi BLE. (Esempio)CompanionDeviceManager
come descritto nella sezione Accoppiamento dei dispositivi companion. (Esempio)
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
: chiamastartScan()
con un oggettoPendingIntent
anziché un oggettoScanCallback
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:
- Un risultato della scansione
BluetoothLeScanner
come descritto nella sezione precedente. - L'elenco di dispositivi collegati recuperato da
BluetoothAdapter.getBondedDevices()
. - La cache di
BluetoothAdapter
, utilizzandoBluetoothAdapter.getRemoteLeDevice()
.
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:
- Utilizza WorkManager per connetterti al
dispositivo.
- Puoi impostare un elemento
PeriodicWorkRequest
oOneTimeWorkRequest
per eseguire un'azione definita, anche se potrebbero essere applicate limitazioni delle app. - Inoltre, puoi trarre vantaggio dalle funzionalità di WorkManager come i vincoli di lavoro, il lavoro accelerato, le norme per i nuovi tentativi e altro ancora.
- Se la connessione deve rimanere attiva il più a lungo possibile per poter eseguire un'attività, ad esempio la sincronizzazione dei dati o il polling dei dispositivi periferici, devi avviare un servizio in primo piano seguendo le indicazioni riportate in Assistenza per i lavoratori a lunga esecuzione. Tuttavia, a partire da Android 12, si applicano le limitazioni relative al lancio di servizi in primo piano.
- Puoi impostare un elemento
- Avvia un servizio in primo piano con il tipo
connectedDevice
.- Se la connessione deve rimanere attiva il più a lungo possibile per poter eseguire un'attività, ad esempio la sincronizzazione dei dati o il polling dei dispositivi periferici, devi avviare un servizio in primo piano seguendo le indicazioni riportate in Assistenza per i lavoratori a lunga esecuzione. Tuttavia, a partire da Android 12, si applicano le limitazioni relative al lancio di servizi in primo piano.
- Richiama
startScan()
con un oggettoPendingIntent
come descritto in Trovare un dispositivo per riattivare il processo quando è presente il dispositivo. Il dispositivo periferico deve contenere pubblicità.- Ti consigliamo di avviare un worker e un job. Questa operazione potrebbe essere interrotta dal sistema e quindi supporta 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 le 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 una volta completata l'attività. Tuttavia, ci sono due casi in cui un'app potrebbe dover mantenere la connessione attiva a tempo indeterminato:
- Durante il passaggio da un'app all'altra.
- Durante l'ascolto delle notifiche relative alle periferiche.
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 tipo
connectedDevice
in primo piano.
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.