Register now for Android Dev Summit 2019!

백그라운드 위치 제한

Android 8.0는 소비전력 절감을 위해 앱의 대상 SDK 버전에 상관없이 백그라운드 앱이 사용자의 현재 위치를 검색할 수 있는 빈도를 제한합니다.

이런 위치 검색 동작은 앱이 백그라운드에서 실행 중인 상태에서 실시간 경고나 모션 감지에 의존하는 경우 특히 유념해야 합니다.

중요: 백그라운드 앱이 매시간 단 몇 차례만 위치 업데이트를 받도록 허용하는 것을 출발점으로 삼겠습니다. 시스템에 미치는 영향과 개발자들의 피드백을 바탕으로 Preview 전체에 걸쳐 위치 업데이트 주기를 계속 조정할 것입니다.

시스템은 포그라운드 앱과 백그라운드 앱을 구분합니다. 다음 조건 중 하나라도 참일 경우 앱이 포그라운드에 있는 것으로 간주합니다.

  • 액티비티가 시작되든 일시 중지되든 상관없이, 보이는 액티비티가 있는 경우
  • 포그라운드 서비스가 있는 경우
  • 앱의 서비스 중 하나에 바인드하거나 앱의 콘텐츠 제공자 중 하나를 사용하여 앱에 또 다른 포그라운드 앱이 연결된 경우

위의 어떤 조건에도 해당하지 않는 경우 앱이 백그라운드에 있는 것으로 간주됩니다.

포그라운드 앱 동작 유지

앱이 Android 8.0를 실행 중인 기기의 포그라운드에 있는 경우 위치 업데이트 동작은 Android 7.1.1(API 레벨 25) 이하와 동일합니다.

경고: 앱이 오랜 기간에 걸쳐 거의 실시간 위치 업데이트를 검색하면 기기의 배터리 수명이 상당히 짧아지게 됩니다.

앱의 위치 동작 조정

앱이 위치 업데이트를 자주 받지 않는 경우에는 백그라운드에서 실행하기 위한 앱의 사용 사례가 전혀 성공할 수 없는지를 고려하세요. 그런 경우라면 다음 작업 중 하나를 수행하여 위치 업데이트를 더 자주 검색할 수 있습니다.

  • 앱을 포그라운드로 가져옵니다.
  • 앱에서 포그라운드 서비스를 사용합니다. 이 서비스가 활성일 때 앱은 알림 영역에 진행 중인 알림을 표시해야 합니다.
  • GeofencingApi 인터페이스와 같이, 전력 사용량 최소화를 위해 최적화된 Geofencing API 요소를 사용합니다.
  • 빠른 속도로 위치를 요청하는 포그라운드 앱이 있는 경우 더 빠른 위치 업데이트를 받을 수 있는 수동적 위치 리스너를 사용합니다.

참고: 앱이 주기가 짧은 업데이트를 포함하는 위치 방문 기록에 액세스할 필요가 있는 경우 FusedLocationProviderApi 인터페이스 같은 Fused Location Provider API 요소의 일괄 처리 버전을 사용하세요. 앱이 백그라운드에서 실행 중일 때 이 API는 비 일괄 처리 API보다 더 자주 사용자 위치 정보를 수신합니다. 하지만 앱은 여전히 매시간 몇 차례만 일괄적으로 업데이트를 수신한다는 점을 유념하세요.

관련 API

백그라운드 앱에서 위치 검색 동작의 변경사항은 다음 API에 영향을 미칩니다.

FLP(Fused Location Provider)
  • 앱이 백그라운드에서 실행 중인 경우 위치 시스템 서비스는 Android 8.0 동작 변경에 정의된 간격에 따라 매시간 몇 차례만 앱을 위해 새 위치를 계산합니다. 앱이 위치 업데이트를 더 자주 요청할 때도 그렇습니다.
  • 앱이 포그라운드에서 실행 중인 경우 Android 7.1.1(API 레벨 25)에 비해 위치 샘플링 레이트에 변화가 없습니다.
Geofencing
  • 백그라운드 앱은 Fused Location Provider에서의 업데이트보다 더 자주 지오펜싱 전환 이벤트를 수신할 수 있습니다.
  • 지오펜싱 이벤트의 평균 응답성은 대략 몇 분 정도입니다.
GNSS Measurements 및 GNSS Navigation Messages
Location Manager
  • Android 8.0 동작 변경에 정의된 간격에 따라 매시간 몇 차례만 백그라운드 앱에 위치 업데이트가 제공됩니다.

    참고: Google Play 서비스가 설치된 기기에서 앱이 실행 중인 경우에는 꼭 FLP(Fused Location Provider)를 대신 사용하시기 바랍니다.

Wi-Fi Manager
startScan() 메서드는 시간당 몇 번씩 백그라운드 앱에 대해 전체 스캔을 수행합니다. 뒤이어 백그라운드 앱이 이 메서드를 다시 호출하면 WifiManager 클래스는 이전 스캔으로부터 캐시된 결과를 제공합니다.