이 가이드에서는 앱이 백그라운드에서 실행 중일 때 주변기기와 통신하는 주요 사용 사례를 지원하는 방법을 간략하게 설명합니다.
이러한 각 사용 사례를 지원하는 여러 옵션이 있습니다. 각 방식에는 장점과 단점이 있어 특정 니즈에 맞게 어느 정도 적합하게 만들 수 있습니다.
다음 다이어그램은 이 페이지의 안내를 간략하게 보여줍니다.
기기 찾기
먼저 앱에서 연결할 기기를 찾아야 합니다. BLE 기기를 찾으려면 다음 API 중 하나를 사용하면 됩니다.
- BLE 기기 찾기에 설명된 대로
BluetoothLeScanner
(샘플) CompanionDeviceManager
(부속 기기 페어링에 설명됨) (샘플)
백그라운드
앱이 표시되지 않을 때 이러한 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()
를 호출하여 기기가 있을 때 프로세스의 절전 모드를 해제합니다. 주변기기는 광고 중이어야 합니다.- 작업자와 작업을 시작하는 것이 좋습니다. 이는 시스템에 의해 중단될 수 있으므로 짧은 통신만 지원할 수 있습니다.
- 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
로 이 사용 사례를 지원하는 것이 가장 좋습니다. 앱이 오랜 시간 동안 수신 대기해야 할 수 있기 때문입니다. 그러나 포그라운드 서비스를 사용할 수도 있습니다.
두 경우 모두 기기에 연결 섹션의 안내에 따라 종료된 프로세스 후에 다시 연결할 수 있습니다.