Перейти к содержанию
Fire Monkey от А до Я
  • 0

Сервис убивается при завершении работы программы


AES

Вопрос

Всем привет, изучаю сервисы, есть пара вопросов... правильно я понимаю? При:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
Result:= TJService.JavaClass.START_STICKY; //Перезапускать при отключении
end;

сервис не должен отрубаться при завершении работы основной программы ?

Я в цикле вывод сообщения в сервис засунул, все работает даже при свернутой программе, но стоит ее закрыть и все... Уведомления перестают приходит, сервис помер..

Как заставит работать сервис даже при закрытой программе запустившей его?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Получилось сделать на A6 (android7), но samsung S9 (android9)  упорно удаляет сервис.
В app:

Спойлер

function getTimeAfterInSecs(Seconds: Integer): Int64;
var
  Calendar: JCalendar;
begin
  Calendar:= TJCalendar.JavaClass.getInstance;
  Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
  Result:= Calendar.getTimeInMillis;
end;

procedure TIntegraApp.StartService;
var
  Intent: JIntent;
  PendingIntent: JPendingIntent; //Androidapi.JNI.App
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString('5sec'));
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceName'));
  PendingIntent:= TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0);
  TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(5), PendingIntent);
end;

procedure TIntegraApp.StopService;
var
 LIntent: JIntent;
begin
  LIntent:= TJIntent.Create;
  LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.ServiceName'));
  LIntent.setAction(StringToJString('StopIntent'));
  TAndroidHelper.Activity.startService(LIntent);
end;

в  сервисе:

Спойлер

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
Var
 S: String;
begin
  S:= JStringToString(Intent.getAction);
  if (S = 'StopIntent') then begin
    Msg('srv','StopIntent');
    Result:= TJService.JavaClass.START_NOT_STICKY; // не перезапускать
    StopAlarmManager;
  end else begin
    //---
    SendToTCP('StartService','');
    //---
    Result:= TJService.JavaClass.START_NOT_STICKY;
    StartAlarmManager(); //перезапуск по AlarmManager
  end;
end;

procedure TDM.StartAlarmManager();
var
  Intent: JIntent;
  PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString('5sec'));
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceName'));
  PendingIntent:= TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0);
  //ELAPSED_REALTIME - ориентируются на время от начала загрузки ОС
  //ELAPSED_REALTIME_WAKEUP - ориентируются на время от начала загрузки ОС и пробуждает устройство из сна.
  //RTC - ориентируются на системное время
  //RTC_WAKEUP - ориентируются на системное время и пробуждает устройство из сна.
  TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(5), PendingIntent);
end;

procedure TDM.StopAlarmManager();
var
  Intent: JIntent;
  PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString('5sec'));
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceName'));
  PendingIntent:= TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0);
  TAndroidHelper.AlarmManager.&cancel(PendingIntent);
end;

 

Так же при выключенном телефоне не ратает idTCPClient, точнее работает но иногда выкидывает ошибки. Есть идеи как побороть  9 андроид? Может в манифест чего добавить что бы 9ка не закрывала службу?

Изменено пользователем IgorK11
Ссылка на комментарий
  • 0

Дело немного сдвинулось. Если на S9 в

Настройки-Приложение-[МоеПриложение]-Батарея-ОптимизацияРасхода-Все

оно же

Настройки-Приложения-...-ОсобыеПраваДоступа-ОптимизацияРасхода-Все

убрать оптимизацию с своего приложения, служба не закрывается и idTCPClient кстати не засыпает.

на A5 служба работает как надо, но idTCPClient засыпает после отключения телефона в промежутке от 3 до 5 минут, а после включения телефона просыпается и продолжает отсылать трафик, делать при этом ничего не нужно.

Вопрос остается открытым, что добавить в манифест что  бы при установке не ставилась "оптимизация расхода" на мое приложение?

Изменено пользователем IgorK11
Ссылка на комментарий
  • 0
  • Модераторы
1 час назад, IgorK11 сказал:

Вопрос остается открытым, что добавить в манифест что  бы при установке не ставилась "оптимизация расхода" на мое приложение?

Посмотрите вот это: https://stackoverflow.com/a/53096282

Ссылка на комментарий
  • 0

манифест

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

не работает,

 FPermissionBAT:= JStringToString(TJManifest_permission.JavaClass.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);

  PermissionsService.RequestPermissions([FPermissionBAT], PermissionResult, PermissionDisplay);

не работает, кстати если использовать для теста права на CAMERA вместо REQUEST_IGNORE_BATTERY_OPTIMIZATIONS - работает

  LIntent:= TJIntent.Create;
  LIntent:= TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
  LIntent.setData(StrToJURI('package:IAApp'));
  TAndroidHelper.Activity.startActivity(LIntent);

Ошибка: android.content.ActivityNotFoundException: No Activity found to handle intent.

без LIntent.setData(StrToJURI('package:IAApp')); открывается ОптимизацияРасхода но приложений/служб там столько что пользователь никогда не полезет искать мое. Не так передаю имя приложения?

 

Изменено пользователем IgorK11
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...