백그라운드에서 소통하기

이 가이드에서는 앱이 백그라운드에서 실행 중일 때 주변기기와 통신하는 주요 사용 사례를 지원하는 방법을 간략히 설명합니다.

이러한 각 사용 사례를 지원하는 여러 옵션이 있습니다. 각 방법에는 특정 요구사항에 더 또는 덜 적합할 수 있는 장점과 단점이 있습니다.

다음 다이어그램은 이 페이지의 안내를 단순화하여 보여줍니다.

기기 찾기

먼저 앱에서 연결할 기기를 찾아야 합니다. BLE 기기를 찾으려면 다음 API 중 하나를 사용하면 됩니다.

백그라운드

앱이 표시되지 않는 동안 이 두 API 중 하나를 사용하는 데는 제한이 없지만, 두 API 모두 앱 프로세스가 실행 중일 때만 사용할 수 있습니다. 앱 프로세스가 실행되지 않는 경우 다음 해결 방법을 사용할 수 있습니다.

  • BluetoothLeScanner의 경우: ScanCallback 객체 대신 PendingIntent 객체를 사용하여 startScan()를 호출하면 필터와 일치하는 기기가 스캔될 때 알림을 받을 수 있습니다. (샘플)
  • CompanionDeviceManager의 경우: 호환 앱을 켠 상태로 유지의 안내에 따라 앱을 깨우고 이전에 연결된 기기가 범위 내에 있는 동안 앱을 깨운 상태로 유지합니다. (샘플)

기기에 연결

기기를 찾은 후 기기에 연결하려면 다음 소스 중 하나에서 기기의 BluetoothDevice 인스턴스를 가져와야 합니다.

BluetoothDevice 인스턴스가 있으면 connectGatt() 메서드 중 하나를 호출하여 상응하는 기기에 대한 연결 요청을 시작할 수 있습니다. autoConnect 불리언에 전달하는 값은 GATT 클라이언트가 사용하는 다음 두 가지 연결 모드 중 하나를 정의합니다.

  • 직접 연결 (autoconnect = false): 주변기기에 직접 연결을 시도하고 기기를 사용할 수 없는 경우 실패합니다. 연결이 끊어지면 GATT 클라이언트는 자동으로 다시 연결을 시도하지 않습니다.
  • 자동 연결 (autoconnect = true): 사용 가능한 경우 항상 주변기기에 자동으로 연결하려고 시도합니다. 주변기기에서 시작된 연결 해제 또는 주변기기가 범위를 벗어난 경우 주변기기를 사용할 수 있게 되면 GATT 클라이언트가 자동으로 다시 연결을 시도합니다.

백그라운드

앱이 백그라운드에 있는 동안 기기에 연결하는 데는 제한이 없지만 프로세스가 종료되면 연결이 닫힙니다. 또한 백그라운드에서 활동을 시작하는 데 제한 (Android 10 이상) 또는 포그라운드 서비스(Android 12 이상)가 있습니다.

따라서 백그라운드에서 연결을 실행하려면 앱에서 다음 솔루션을 사용할 수 있습니다.

기기에 연결 상태 유지

앱은 필요한 기간 동안만 주변기기와의 연결을 유지하고 작업이 완료되면 연결을 해제하는 것이 좋습니다. 그러나 앱에서 연결을 무기한 유지해야 하는 두 가지 경우가 있습니다.

두 경우 모두 다음 옵션을 사용할 수 있습니다.

앱 간에 전환하는 동안

기기를 찾고, 기기에 연결하고, 데이터를 전송하는 작업은 시간이 많이 걸리고 리소스 집약적입니다. 사용자가 앱 간에 전환하거나 동시 작업을 실행할 때마다 연결이 끊어지고 전체 프로세스를 실행해야 하는 상황을 방지하려면 작업이 완료될 때까지 연결을 유지해야 합니다. connectedDevice 유형의 포그라운드 서비스 또는 컴패니언 기기 존재 API를 사용할 수 있습니다.

주변기기 알림을 듣는 동안

주변기기 알림을 수신 대기하려면 앱이 setCharacteristicNotification()를 호출하고, onCharacteristicChanged()를 사용하여 콜백을 수신 대기하고, 연결을 유지해야 합니다. 대부분의 앱에서는 CompanionDeviceService로 이 사용 사례를 지원하는 것이 가장 좋습니다. 앱이 장시간 리슨을 계속해야 할 가능성이 높기 때문입니다. 하지만 포그라운드 서비스를 사용할 수도 있습니다.

두 경우 모두 기기에 연결 섹션의 안내에 따라 종료된 프로세스 후에 다시 연결할 수 있습니다.