Всем кто в сервис передает параметры, типа:
procedure TFrmMain.StartService();
var
LIntent: JIntent;
begin
LIntent := TJIntent.Create;
LIntent.setClassName(TAndroidHelper.Context.getPackageName(),
TAndroidHelper.StringToJString('com.embarcadero.services.TestRemoteServ'));
LIntent.setAction(StringToJString('StartService'));
TAndroidHelper.Activity.startService(LIntent);
end;
function TDM.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then
begin
Log('START_NOT_STICKY');
Result := TJService.JavaClass.START_NOT_STICKY;
end
else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then
begin
Log('START_STICKY');
Result := TJService.JavaClass.START_STICKY;
end;
end;
обязательно проверяйте Intent на nil !
Когда система убивает ваше приложение из-за нехватки памяти и перезапускает сервис, то на Intent.getAction происходит Segmentation fault и сервис остается в подвешенном состоянии (на процессоре ARM в Приложения - Работающие у меня отображается как-будто сервис нормально перезапустился, а вот на процессоре Intel - видно как сервис находится в вечном перезапуске). И естественно хост-приложение не может нормально стартануть.
Делаем примерно так:
function TDM.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
if Intent<>nil then
begin
if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then
begin
Log('START_NOT_STICKY');
Result := TJService.JavaClass.START_NOT_STICKY;
end
else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then
begin
Log('START_STICKY');
Result := TJService.JavaClass.START_STICKY;
end;
end
else
begin
Log('RESTART BY SYSTEM');
Result := TJService.JavaClass.START_STICKY;
end;
end;