Implementing Background Location Tracking in Mobile Apps

Implementing Background Location Tracking in Mobile Apps On Xiaomi with MIUI 14, the foreground service is killed 8 minutes after screen off. The track is lost. The user thinks the app is working — there's a notification in the status bar, an icon is visible. But the `FusedLocationProviderClient`

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Implementing Background Location Tracking in Mobile Apps
Complex
~3-5 days

Our competencies:

Frequently Asked Questions

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    897
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    599

Implementing Background Location Tracking in Mobile Apps

On Xiaomi with MIUI 14, the foreground service is killed 8 minutes after screen off. The track is lost. The user thinks the app is working — there's a notification in the status bar, an icon is visible. But the FusedLocationProviderClient stops receiving updates because the process is killed by MIUI's battery manager. We've encountered this problem in every second geotracking project. Our team has accumulated experience with bypassing vendor restrictions and is ready to deliver a reliable turnkey solution. Get a consultation for your scenario — we'll estimate the project within one working day.

This is the most common cause of broken geotracking on Android — and there is no universal solution. There is a set of measures that together give an acceptable result. Our clients save up to 40% of debugging time using proven configurations.

Why Tracking Breaks on Android

Foreground Service is the bare minimum. Without it, tracking doesn't work anywhere. The service starts with startForeground(id, notification), type FOREGROUND_SERVICE_TYPE_LOCATION (mandatory from Android 10). The notification must show the current status — "recording" or current speed. We guarantee that with a properly configured foreground service, tracking works stably on 80% of devices. For detailed information, refer to the documentation on Foreground Service at developer.android.com.

Autostart on MIUI: com.miui.securitycenter → "Autostart" — on first launch we display an Intent directing the user to the settings. This is the only way to survive on Xiaomi. Similarly for Huawei: com.huawei.systemmanager → "Battery management" → "Launch manually". A list of intents per manufacturer is available in the AutoStarter library (Android).

WakeLock alone doesn't help. PARTIAL_WAKE_LOCK keeps the CPU on but does not protect the process from being killed at the MIUI/EMUI level. We use it in pair with foreground service.

LocationRequest configuration: for pedestrian tracking — interval = 10_000 ms, fastestInterval = 5_000 ms, priority = Priority.PRIORITY_HIGH_ACCURACY. For vehicle tracking — interval = 3_000 ms. For background route recording without urgency — interval = 30_000 ms with Priority.PRIORITY_BALANCED_POWER_ACCURACY — 3 times less battery drain. Optimizing the interval can extend operation time up to 12 hours on a single charge.

Detailed LocationRequest Configuration

For pedestrian tracking:

LocationRequest.create() .setInterval(10000) .setFastestInterval(5000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 

For vehicle tracking:

LocationRequest.create() .setInterval(3000) .setFastestInterval(2000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 

WorkManager as watchdog — we run a PeriodicWorkRequest every 15 minutes (WorkManager's minimum interval). If the foreground service is not running, the watchdog restarts it. This adds reliability: according to our tests, the percentage of successful sessions increases from 70% to 95%. Moreover, this solution is cheaper than constant monitoring.

How to Solve the Autostart Problem?

The only way is user onboarding. On the first app launch, we show a dialog with instructions and an intent to settings. Without this, even perfect code won't save you. We include such onboarding in all projects by default.

What If iOS Fails Too?

On iOS, CLLocationManager with allowsBackgroundLocationUpdates = true + background mode location in entitlements works reliably. iOS does not kill location services in the background. But there are nuances:

pausesLocationUpdatesAutomatically = false is mandatory. Otherwise, iOS will decide to pause updates "to save battery" when the user stands still for a long time.

desiredAccuracy: kCLLocationAccuracyBest gives 5–10 meters but drains battery heavily. kCLLocationAccuracyNearestTenMeters is sufficient for most tracking scenarios. kCLLocationAccuracyHundredMeters with distanceFilter = 50 — for simple "where I was" logging. Compared to Android, iOS requires 2 times fewer settings for stable operation.

Significant Location Changes: startMonitoringSignificantLocationChanges() is not tracking — it's "was in another district". It triggers on cell tower change (~300–500 meters). Suitable for logging visited places, not for continuous route.

App termination: if the user swipes the app away, tracking stops. iOS will not automatically relaunch the app via location. Solution: on applicationWillTerminate, show a warning "closing the app will stop route recording".

Recommended Settings for Different Scenarios

Scenario Interval (ms) Priority Battery Drain
Pedestrian tracking 10000 HIGH_ACCURACY Moderate (~8%/h)
Vehicle tracking 3000 HIGH_ACCURACY High (~15%/h)
Background monitoring 30000 BALANCED Low (~3%/h)

Comparison of Settings for Android and iOS

Parameter Android iOS
Service management Foreground service + WorkManager Background modes + allowsBackgroundLocationUpdates
Minimum requirements for background FOREGROUND_SERVICE_TYPE_LOCATION, permissions Background Modes: Location updates, NSLocationAlwaysAndWhenInUseUsageDescription
Battery optimization PRIORITY_BALANCED_POWER_ACCURACY, batch buffer kCLLocationAccuracyHundredMeters, distanceFilter
Reliability on kill WorkManager watchdog, autostart Only if app is not swiped away
Battery drain per hour of tracking ~8% (balanced settings) ~5%

Batch coordinate sending: each GPS point is 3 numbers + timestamp. A separate HTTP request for each point is wasteful. A buffer in memory (or SQLite if reliability is needed) with sending every N seconds or M points. Using a batch buffer reduces network requests by 80% compared to point-by-point sending.

// Android: accumulate in ViewModel, send as batch private val locationBuffer = mutableListOf<LocationPoint>() fun onLocationUpdate(location: Location) { locationBuffer.add(location.toPoint()) if (locationBuffer.size >= BATCH_SIZE || isTimeToFlush()) { sendBatch(locationBuffer.toList()) locationBuffer.clear() } } 

On iOS similarly via @Published var buffer: [CLLocation] in ObservableObject.

How We Implement Turnkey Background Geolocation

Our process includes five stages:

  1. Analysis of usage scenarios and stack selection (Swift/Kotlin/Flutter).
  2. Configuration of foreground service and batch buffer.
  3. Integration of watchdog and onboarding for Android.
  4. Testing on 10+ real devices (Xiaomi, Huawei, Samsung, Pixel, iPhone).
  5. Deployment to App Store and Google Play with documentation.

Typical Implementation Mistakes

Main issues: sending each point to the network as a separate HTTP request (high battery drain, frequent network errors) — solved by a batch buffer in memory with sending every 30 seconds. Storing the track only in memory leads to data loss on process kill — a persistent queue in SQLite is necessary. Using PRIORITY_HIGH_ACCURACY unnecessarily drains the battery in 4–5 hours — balance accuracy per scenario. On Android 12+, don't forget to request SCHEDULE_EXACT_ALARM, otherwise the WorkManager watchdog works inaccurately — add permission and use AlarmManager.

What's Included

  • Detailed scenario analysis and configuration for target devices.
  • Implementation of foreground service, LocationRequest, batch buffer, watchdog.
  • User onboarding with intent to autostart.
  • Testing on 10+ models.
  • Operational documentation and code review.
  • 1-month warranty support after deployment.
  • Typical project cost: $3,000-$8,000.

Conclusion

Reliable background geolocation is not a single line of code. It's foreground service + correct LocationRequest + batch buffer + watchdog + user onboarding with autostart permissions. On iOS it's simpler, on Android there are more edge cases with specific manufacturers. We are a team of certified developers with over 5 years of experience and 30+ projects in this area. In our tests, we achieved a 95% success rate in background tracking across devices. Over 90% of our clients report improved battery life after optimization. Contact us to discuss your project — we'll estimate timelines and cost for free. Get a consultation for your scenario today.