위치 업데이트 요청

위치 정보를 적절하게 사용하면 앱 사용자에게 도움이 될 수 있습니다. 예를 들어 사용자가 걷거나 운전하는 동안 길을 찾아주는 앱 또는 애셋의 위치를 추적하는 앱은 일정한 간격으로 기기의 위치를 파악해야 합니다. 지리적 위치(위도 및 경도)만이 아니라 기기의 방위(수평 이동 방향), 고도 또는 속도와 같은 추가 정보도 사용자에게 제공할 수 있습니다. 이와 같은 여러 정보는 앱이 통합 위치 정보 제공자로부터 검색할 수 있는 Location 객체를 통해 제공됩니다. 이를 위해 API는 정기적으로 Wi-Fi 및 GPS(위성 위치 확인 시스템)와 같은 현재 사용 가능한 위치 정보 제공자를 기반으로 앱을 가장 근접한 위치로 업데이트합니다. 위치의 정확성은 제공자, 요청한 위치 정보 액세스 권한 및 위치 요청에 설정한 옵션에 따라 결정됩니다.

이 과정에서는 통합 위치 정보 제공자에 requestLocationUpdates() 메서드를 사용하여 기기의 위치에 관한 정기 업데이트를 요청하는 방법을 보여줍니다.

마지막으로 알려진 위치 가져오기

기기의 마지막으로 알려진 위치는 정기적인 위치 업데이트를 시작하기 전에 앱에 알려진 위치가 있는 것이므로 편리한 시작 기반을 제공합니다. 마지막으로 알려진 위치 가져오기 과정에서는 getLastLocation()을 호출하여 마지막으로 알려진 위치를 가져오는 방법을 보여줍니다. 다음 섹션의 스니펫에서는 이미 앱이 마지막으로 알려진 위치를 검색하여 전역 변수 mCurrentLocationLocation 객체로 저장했다고 가정합니다.

위치 요청

앱은 위치 업데이트를 요청하기 전에 위치 서비스에 연결하여 위치를 요청해야 합니다. 위치 설정 변경 과정에서는 이러한 작업을 실행하는 방법을 보여줍니다. 위치 요청이 완료되면 requestLocationUpdates()를 호출하여 정기 업데이트를 시작할 수 있습니다.

요청 양식에 따라 통합 위치 정보 제공자는 LocationCallback.onLocationResult() 콜백 메서드를 호출하고 이 메서드에 Location 객체의 목록을 전달하거나 확장된 데이터에 위치가 포함되어 있는 PendingIntent를 실행합니다. 업데이트의 정확성과 빈도는 요청한 위치 정보 액세스 권한과 위치 요청 객체에 설정한 옵션의 영향을 받습니다.

이 과정에서는 LocationCallback 콜백 접근 방식을 사용하여 업데이트를 가져오는 방법을 보여줍니다. requestLocationUpdates()를 호출하여 LocationRequest 객체의 인스턴스와 LocationCallback을 전달합니다. 다음 코드 샘플과 같이 startLocationUpdates() 메서드를 정의하세요.

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

위 코드 스니펫은 사용자가 위치 업데이트를 사용 설정했는지 사용 중지했는지 추적하는 데 사용되는 부울 플래그인 requestingLocationUpdates를 참조합니다. 사용자가 위치 업데이트를 사용 중지한 경우 사용자에게 앱의 위치 요구사항을 알릴 수 있습니다. 여러 활동 인스턴스에서 이 부울 플래그 값을 유지하는 방법에 관한 자세한 내용은 활동 상태 저장을 참조하세요.

위치 업데이트 콜백 정의

통합 위치 정보 제공자는 LocationCallback.onLocationResult() 콜백 메서드를 호출합니다. 수신 인수에는 위치의 위도 및 경도가 포함되어 있는 목록 Location 객체가 있습니다. 다음 스니펫은 LocationCallback 인터페이스를 구현하고 메서드를 정의한 후 위치 업데이트의 타임스탬프를 가져오고 앱의 사용자 인터페이스에 위도, 경도 및 타임스탬프를 표시하는 방법을 보여줍니다.

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

위치 업데이트 중지

사용자가 다른 앱 또는 동일한 앱의 다른 활동으로 전환하는 경우와 같이 더 이상 활동에 포커스가 없을 때 위치 업데이트를 중지할지 여부를 고려합니다. 백그라운드에서 실행 중일 때에도 앱이 정보를 수집할 필요가 없는 경우 위치 업데이트를 중지하면 전력 소모를 줄이는 데 도움이 될 수 있습니다. 이 섹션에서는 활동의 onPause() 메서드로 업데이트를 중지하는 방법을 보여줍니다.

위치 업데이트를 중지하려면 다음 코드 샘플에서와 같이 removeLocationUpdates()를 호출하여 LocationCallback을 전달하세요.

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

위치 업데이트가 현재 사용 설정되어 있는지 추적하려면 부울인 requestingLocationUpdates를 사용합니다. 활동의 onResume() 메서드에서 위치 업데이트가 현재 활성 상태인지 확인하고 아닌 경우 위치 업데이트를 활성화하세요.

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

활동 상태 저장

기기 구성 변경(예: 화면 방향 또는 언어 변경)으로 인해 현재 활동이 제거될 수 있습니다. 따라서 앱이 활동을 다시 만드는 데 필요한 정보를 저장해야 합니다. 이렇게 하는 한 가지 방법은 Bundle 객체에 저장된 인스턴스 상태를 사용하는 것입니다.

다음 코드 샘플은 활동의 onSaveInstanceState() 콜백을 사용하여 인스턴스 상태를 저장하는 방법을 보여줍니다.

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

활동의 이전 인스턴스로부터 저장된 값이 있는 경우 이 값을 복원하도록 updateValuesFromBundle() 메서드를 정의합니다. 다음 코드 샘플과 같이 활동의 onCreate() 메서드에서 이 메서드를 호출하세요.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

인스턴스 상태 저장에 관한 자세한 내용은 Android Activity 클래스 참조를 확인하세요.

참고: 영구적인 저장을 위해 앱의 SharedPreferences에 사용자의 환경설정을 저장할 수 있습니다. 활동의 onPause() 메서드에 공유 환경설정을 지정하고 onResume()에서 환경설정을 검색합니다. 환경설정 저장에 관한 자세한 내용은 키-값 세트 저장을 참조하세요.

추가 리소스

자세히 알아보려면 다음 리소스를 활용해 주시기 바랍니다.

샘플

  • 샘플 앱은 Android에서 위치 업데이트를 수신하는 방법을 보여줍니다.