Мне нужно постоянно отслеживать местоположение пользователя, даже если пользователь не использует мое приложение. Однако мои знания о архитектуре android/ios немного ниже, чтобы знать, как это сделать.
Нужно ли мне делать все свое приложение в памяти в любое время (и я думаю, что это будет небольшая трата ресурсов), или мне нужно создать небольшое приложение вроде сервиса (даже не знаю, возможно ли это ) для выполнения этой работы?
Попробуйте использовать службу Android с атрибутом START_STICKY. В фоновом потоке вы можете прослушивать изменения местоположения (не используйте стандартный LocationSensor - просто реализуйте решение на основе Java).
Вы также можете найти примеры фоновых операций для iOS.
Для андроид вас может заинтересовать единица 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
И для вашего сервисного модуля вы должны объявить некоторые переменные
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);