Delphi Android Service работает в фоне, но координаты не запрашивает новые
Android 11, Rad Studio 10.4. Собственно с запуском сервиса все норм. Стартует, пока приложение на переднем плане сервис работает исправно, координаты обновляются ежесекундно. Запуск сервиса (убрал проверку разрешений и прочее):
procedure TMainForm.Button1Click(Sender: TObject);
var
LIntent: JIntent;
LService: string;
MyNotification: TNotification;
begin
LIntent := TJIntent.Create;
LService := 'GPSService';
if not LService.StartsWith('com.embarcadero.services.') then
LService := 'com.embarcadero.services.' + LService;
LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(LService));
TAndroidHelper.Activity.startService(LIntent);
End;
Запуск самого сервиса:
function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
StartLocator();
Result:=TJService.JavaClass.START_STICKY;
end;
procedure TAndroidServiceDM.StartLocator();
var
LocationManagerService: JObject;
GPSLocation, NetworkLocation: JLocation;
begin
if not Assigned(FLocationManager) then
begin
LocationManagerService := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID);
if not Assigned(locationListener) then
locationListener := TLocationListener.Create(self);
FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 1000, 0, locationListener);
FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.NETWORK_PROVIDER, 1000, 0, locationListener);
end;
NetworkLocation := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.NETWORK_PROVIDER);
GPSLocation := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
onLocationChanged(NetworkLocation);
onLocationChanged(GPSLocation);
end;
В логах новые координаты появляются пока приложение на переднем плане, как только сворачиваю - координаты не обновляются. Хотя судя по процессам и статусу процесса в android.bat сервис работает. Стоит развернуть приложение из фона - координаты снова обновляются.
procedure TAndroidServiceDM.onLocationChanged(Location: JLocation);
var
M: TMarshaller;
begin
if Assigned(Location) then
begin
Logi(M.AsUtf8('LogAltitude '+ Location.getAltitude.ToString).ToPointer);
Logi(M.AsUtf8('LogLatitude '+ Location.getLatitude.ToString).ToPointer);
Logi(M.AsUtf8('LogLongitude '+Location.getLongitude.ToString).ToPointer);
Logi(M.AsUtf8('LogTime '+Location.getTime.ToString).ToPointer);
end;
end;
Файл манифеста:
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.embarcadero.MyFirstServiceApp"
android:versionCode="1"
android:versionName="1.0.0"
android:installLocation="auto">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="True"
android:restoreAnyVersion="False"
android:label="MyFirstServiceApp"
android:debuggable="True"
android:largeHeap="False"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme"
android:hardwareAccelerated="true">
<service android:exported="false" android:name="com.embarcadero.services.GPSService" android:stopWithTask="false"/>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="MyFirstServiceApp"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="MyFirstServiceApp" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
Собственно вопрос - что нужно сделать чтобы координаты обновлялись в фоне?