Try to use android service with START_STICKY attribute.
In background thread you can listen for location changes (do not use standard LocationSensor - just implement java interface based solution).
You can also find examples of background operations for iOS.
For android you might be interested in unit Androidapi.JNI.Location
TLocationListener = class(TJavaLocal, JLocationListener)
public
procedure onLocationChanged(location: JLocation); cdecl;
procedure onProviderDisabled(provider: JString); cdecl;
procedure onProviderEnabled(provider: JString); cdecl;
procedure onStatusChanged(provider: JString; status: Integer; extras: JBundle); cdecl;
end
And for your service module you have to declare some variables
TServiceModule = class(TAndroidService)
function AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
private
FLocationManager: JLocationManager;
FLocationManagerService: JObject;
FLocationListener: JLocationListener;
function TServiceModule.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
Result := TJService.JavaClass.START_STICKY;
FLocationManagerService := TAndroidHelper.Context.getSystemService(
TJContext.JavaClass.LOCATION_SERVICE);
FLocationManager := TJLocationManager.Wrap(
(FLocationManagerService as ILocalObject).GetObjectID);
if FLocationManager.isProviderEnabled(
TJLocationManager.JavaClass.GPS_PROVIDER) then
begin
FLocationListener := TLocationListener.Create;
FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER,
0, 0, FLocationListener, TJLooper.JavaClass.getMainLooper);