È possibile iscriversi anche in background per ricevere Intenzioni anziché notifiche MessageListener. La scansione in background è una scansione a basso consumo, quindi la latenza può essere molto lunga (anche i minuti per rilevare il beacon). La scansione viene eseguita all'evento sullo schermo o quando altre app lo richiedono. Quindi ricevi risultati da altre scansioni di app.
È possibile creare GoogleApiClient utilizzando il contesto dell'applicazione anziché il contesto dell'attività. Chiamalo da un ricevitore broadcast che reagisce alla trasmissione BOOT_COMPLETED.
GoogleApiClient client = new GoogleApiClient.Builder(appContext)
.addApi(Nearby.MESSAGES_API, new MessagesOptions.Builder()
.setPermissions(NearbyPermissions.BLE)
.build())
.build();
client.connect();
Una volta che il client è connesso (il metodo di ConnectionCallbacks onConnected) è possibile utilizzare subscribe PendingIntent e creare il ricevitore broadcast che gestisce l'intento.
Nel ricevitore di trasmissione, è possibile gestire l'intento utilizzando il metodo Nearby.Messages.handleIntent che utilizza lo stesso MessageListener come scansione in primo piano.
Uno dei problemi con questo approccio sono le autorizzazioni per accedere nelle vicinanze. Per consentire all'utente di approvare l'accesso a Nearby hai bisogno dell'interfaccia utente. La mia soluzione era di aspettare con la scansione in background fino a quando l'utente per la prima volta apre l'app e accetta le autorizzazioni. Una volta accettato puoi iscriverti in background.