The Mapbox Navigation SDK's internal logic runs various calculations, no matter whether it's for turn-by-turn navigation or free-drive mode. It manages, filters, and enhances location updates. It computes precise route progress data when navigating. It has many observers and you can receive callbacks that deliver various types of information.

There are times when you might want to plainly know when this logic has started or stopped. When it changes, perhaps you'll make Location listening updates, change an Android-system View's visibility, or move the MapboxMap's camera.

This page explains how you can be notified of the start or stop state so that you can make the changes that you want.

Managing the session

To take advantage of the Navigation SDK's observers and logic, you need to request the location permissions and start the trip session:


When started, the session will create and run a Foreground Android Service, ensuring a stable stream of raw location updates to process, even when the app is in the background.

To pause the stream of navigation events and stop the Foreground Service, call:


Trip session events

While the session is started and actively processing raw location updates, it returns the computed data using multiple observers:

Observe TripSessionState

The TripSessionStateObserver observer interface provides a TripSessionState object whenever the state has changed.

The Navigation SDK's TripSessionState enum class provides the two possible states:

  • STARTED – State when the session is active. An active session runs a foreground service. Location updates are continually requested and returned to the Navigation SDK.
  • STOPPED – State when the session is inactive.

To observe the session's state, create the interface object:

val tripSessionStateObserver = object : TripSessionStateObserver {

    override fun onSessionStateChanged(tripSessionState: TripSessionState) {

        when (tripSessionState) {

            TripSessionState.STARTED -> {


            TripSessionState.STOPPED -> {


Register the interface object with your already-instantiated MapboxNavigation object:


Don’t forget to unregister the TripSessionStateObserver interface!:

override fun onStop() {


The unregistering above is automatically done for you if you run mapboxNavigation.onDestroy().