If every app had to interpret the raw GPS input itself, it would be very silly. Different apps would duplicate the same effort of decoding and interpreting the GPS input to compute a location. Different apps would end up using different libraries to do it, so each app might end up with a different idea of your location.
Instead, the process of interpreting the GPS data to compute with a location is handled centrally in Android itself. The Android system offers an interface for apps to query the location without having to worry about the details of whether it came from GPS, cell towers, or Wi-Fi networks.
This way, only the Android system has to compute the location, using any possible sources, it can give this location to many apps without duplicating effort, and (as you've noticed) each app doesn't have to start from scratch to compute the location. More recent Android versions also do clever tricks like giving a less precise location to apps that have the "approximate (network-based) location" permission but not the "precise (GPS) location" permission, regardless of which methods were actually used to determine the location.
Internally, this works with what's called a bound system service: an IPC mechanism for different processes to receive data from the service that actually computes the location. The service does run in user space, not inside the kernel, and like any other Android app it runs inside its own process. (Only the very low levels of the GPS receiver driver run inside the kernel.) The details of that are well beyond the scope of this site, but if you're interested, you can learn more by reading the Location Strategies page in the official Android Developers' Guide.