이 가이드에서는 앱이 백그라운드에서 실행 중일 때 주변기기와 통신하는 주요 사용 사례를 지원하는 방법을 간략히 설명합니다.
이러한 각 사용 사례를 지원하는 여러 옵션이 있습니다. 각 방법에는 특정 요구사항에 더 또는 덜 적합할 수 있는 장점과 단점이 있습니다.
다음 다이어그램은 이 페이지의 안내를 단순화하여 보여줍니다.
기기 찾기
먼저 앱에서 연결할 기기를 찾아야 합니다. BLE 기기를 찾으려면 다음 API 중 하나를 사용하면 됩니다.
- BLE 기기 찾기에 설명된 대로
BluetoothLeScanner
(샘플) - 호환 기기 페어링에 설명된 대로
CompanionDeviceManager
(샘플)
백그라운드
앱이 표시되지 않는 동안 이 두 API 중 하나를 사용하는 데는 제한이 없지만, 두 API 모두 앱 프로세스가 실행 중일 때만 사용할 수 있습니다. 앱 프로세스가 실행되지 않는 경우 다음 해결 방법을 사용할 수 있습니다.
BluetoothLeScanner
의 경우:ScanCallback
객체 대신PendingIntent
객체를 사용하여startScan()
를 호출하면 필터와 일치하는 기기가 스캔될 때 알림을 받을 수 있습니다. (샘플)CompanionDeviceManager
의 경우: 호환 앱을 켠 상태로 유지의 안내에 따라 앱을 깨우고 이전에 연결된 기기가 범위 내에 있는 동안 앱을 깨운 상태로 유지합니다. (샘플)
기기에 연결
기기를 찾은 후 기기에 연결하려면 다음 소스 중 하나에서 기기의 BluetoothDevice
인스턴스를 가져와야 합니다.
- 이전 섹션에 설명된
BluetoothLeScanner
스캔 결과입니다. BluetoothAdapter.getBondedDevices()
에서 가져온 결합된 기기 목록입니다.BluetoothAdapter.getRemoteLeDevice()
를 사용하는BluetoothAdapter
캐시
BluetoothDevice
인스턴스가 있으면 connectGatt()
메서드 중 하나를 호출하여 상응하는 기기에 대한 연결 요청을 시작할 수 있습니다. autoConnect
불리언에 전달하는 값은 GATT 클라이언트가 사용하는 다음 두 가지 연결 모드 중 하나를 정의합니다.
- 직접 연결 (
autoconnect = false
): 주변기기에 직접 연결을 시도하고 기기를 사용할 수 없는 경우 실패합니다. 연결이 끊어지면 GATT 클라이언트는 자동으로 다시 연결을 시도하지 않습니다. - 자동 연결 (
autoconnect = true
): 사용 가능한 경우 항상 주변기기에 자동으로 연결하려고 시도합니다. 주변기기에서 시작된 연결 해제 또는 주변기기가 범위를 벗어난 경우 주변기기를 사용할 수 있게 되면 GATT 클라이언트가 자동으로 다시 연결을 시도합니다.
백그라운드
앱이 백그라운드에 있는 동안 기기에 연결하는 데는 제한이 없지만 프로세스가 종료되면 연결이 닫힙니다. 또한 백그라운드에서 활동을 시작하는 데 제한 (Android 10 이상) 또는 포그라운드 서비스(Android 12 이상)가 있습니다.
따라서 백그라운드에서 연결을 실행하려면 앱에서 다음 솔루션을 사용할 수 있습니다.
- WorkManager를 사용하여 기기에 연결합니다.
- 앱 제한이 적용될 수 있지만 정의된 작업을 실행하도록
PeriodicWorkRequest
또는OneTimeWorkRequest
를 설정할 수 있습니다. - 또한 작업 제약 조건, 신속한 작업, 재시도 정책과 같은 WorkManager 기능을 활용할 수 있습니다.
- 주변기기에서 데이터 동기화 또는 폴링과 같은 작업을 실행하기 위해 연결을 최대한 오래 유지해야 하는 경우 장기 실행 작업자 지원의 안내에 따라 포그라운드 서비스를 시작해야 합니다. 그러나 Android 12부터는 포그라운드 서비스 실행 제한이 적용됩니다.
- 앱 제한이 적용될 수 있지만 정의된 작업을 실행하도록
connectedDevice
유형으로 포그라운드 서비스를 시작합니다.- 주변기기에서 데이터 동기화 또는 폴링과 같은 작업을 실행하기 위해 연결을 최대한 오래 유지해야 하는 경우 장기 실행 작업자 지원의 안내에 따라 포그라운드 서비스를 시작해야 합니다. 그러나 Android 12부터는 포그라운드 서비스 실행 제한이 적용됩니다.
- 기기 찾기에 설명된 대로
PendingIntent
객체로startScan()
를 호출하여 기기가 있을 때 프로세스를 깨웁니다. 주변기기 기기가 광고를 게재하고 있어야 합니다.- Worker와 Job을 시작하는 것이 좋습니다. 이는 시스템에 의해 중단될 수 있으므로 짧은 시간의 통신만 지원할 수 있습니다.
- Android 12 미만 버전에서는
PendingIntent
객체에서 직접 포그라운드 서비스를 시작할 수 있습니다.
CompanionDeviceService
및REQUEST_COMPANION_RUN_IN_BACKGROUND
또는REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
권한 중 하나를 사용하여 백그라운드에서 서비스를 시작합니다.
기기에 연결 상태 유지
앱은 필요한 기간 동안만 주변기기와의 연결을 유지하고 작업이 완료되면 연결을 해제하는 것이 좋습니다. 그러나 앱에서 연결을 무기한 유지해야 하는 두 가지 경우가 있습니다.
두 경우 모두 다음 옵션을 사용할 수 있습니다.
REQUEST_COMPANION_RUN_IN_BACKGROUND
권한 및CompanionDeviceManager.startObservingDevicePresence()
메서드와 함께CompanionDeviceService
를 사용합니다.- 앱이 포그라운드에 있거나 (또는
connectedDevice
포그라운드 유형의 예외 중 하나에 있음) 포그라운드 서비스를 시작합니다.
앱 간에 전환하는 동안
기기를 찾고, 기기에 연결하고, 데이터를 전송하는 작업은 시간이 많이 걸리고 리소스 집약적입니다. 사용자가 앱 간에 전환하거나 동시 작업을 실행할 때마다 연결이 끊어지고 전체 프로세스를 실행해야 하는 상황을 방지하려면 작업이 완료될 때까지 연결을 유지해야 합니다. connectedDevice
유형의 포그라운드 서비스 또는 컴패니언 기기 존재 API를 사용할 수 있습니다.
주변기기 알림을 듣는 동안
주변기기 알림을 수신 대기하려면 앱이 setCharacteristicNotification()
를 호출하고, onCharacteristicChanged()
를 사용하여 콜백을 수신 대기하고, 연결을 유지해야 합니다. 대부분의 앱에서는 CompanionDeviceService
로 이 사용 사례를 지원하는 것이 가장 좋습니다. 앱이 장시간 리슨을 계속해야 할 가능성이 높기 때문입니다. 하지만 포그라운드 서비스를 사용할 수도 있습니다.
두 경우 모두 기기에 연결 섹션의 안내에 따라 종료된 프로세스 후에 다시 연결할 수 있습니다.