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

После "сна" программа с сервисом не стартует


Rusland

Вопрос

Проблема давняя, хочется наконец разобраться с ней.

Вот создал тестовый пример, в котором приложение TestPro и локальный Android-сервис к нему TestService2.

Запускаю программу, нажимаю кнопку Start Service, сервис стартует (увидеть можно в Настройки -> Приложения -> Работающие).

Не закрывая программу, перехожу к другим программам и работаю в них. Лучше всего перейти в какой-нибудь браузер и полазить по вкладкам (это довольно ресурсоемкое приложение). 

После нескольких минут через диспетчер задач я возвращаюсь в свое приложение и оно начинает загружаться с нуля. То есть система давно прибила программу и она начинает загрузку заново. Так вот программа долго висит на заставке, а потом выходит сообщение что приложение не отвечает! Нажимаем OK. После повторного перезапуска программы происходит тоже самое и лишь на третий раз программа запускается.

Как решить эту проблему?

 

Я пробовал убивать сервис

var
  LIntent: JIntent;

  LIntent := TJIntent.Create;
  LIntent.setClassName(TAndroidHelper.Context.getPackageName(),
   TAndroidHelper.StringToJString('com.embarcadero.services.TestService2'));
  TAndroidHelper.Activity.stopService(LIntent);

до строчки Application.Initialize - не помогает.

 

TestService2.zip

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

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

  • 0
1 час назад, Rusland сказал:

Я пробовал убивать сервис

Я пробовал убивать процесс, вместе с сервисом соответственно, чистил Recently Apps — не помогает.

А была сборка, где работало все идеально.

Копаю в сторону настройки SDK.

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

В проекте поставил логгирование.

var
  LIntent: JIntent;

{$R *.res}

begin
  LogI('Try to kill service');

  // убиваем сервис
  LIntent := TJIntent.Create;
  LIntent.setClassName(TAndroidHelper.Context.getPackageName(),
   TAndroidHelper.StringToJString('com.embarcadero.services.TestService'));
  TAndroidHelper.Activity.stopService(LIntent);

  LogI('Service killed');

  Application.Initialize;
  LogI('Application.Initialize');

  Application.CreateForm(TFrmMain, FrmMain);
  LogI('Application.CreateForm(TFrmMain, FrmMain)');

  Application.Run;

end.

Так вот в момент первого старта программы (после прибития системой) LogI('Try to kill service'); не срабатывает, приходится "снимать задачу". После второго тоже. И лишь на третий раз все логи показываются нормально и программа стартует. То есть программа даже до инициализации не доходит и до кода прибития сервиса естественно тоже.

PS. Если зайти в Работающие приложения и остановить сервис, то программа нормально запускается.

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Rusland сказал:

А на какой версии Дельфи работало идеально?

если напишу что на следующей версии, будет всегда актуально))

Ссылка на комментарий
  • 0
Только что, Rusland сказал:

А на какой версии Дельфи работало идеально?

В Берлине.

У меня пока нет идей, как избавиться от этого зависания.

Есть предположение, что появление этого бага зависит от выбора версии "android-sdk-windows\build-tools" и "android-sdk-windows\platforms".

 

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

Pax Beach, а зависает на всех видах сервиса (Intent Local Service, Remote Service) или только при использовании Local Service?

PS. Сам то я только Local пробовал, с остальными не знаком.

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
22 минуты назад, Rusland сказал:

Pax Beach, а зависает на всех видах сервиса (Intent Local Service, Remote Service) или только при использовании Local Service?

PS. Сам то я только Local пробовал, с остальными не знаком.

Я локальный не проверял на зависания. Работаю с Remote Service. Как по мне, это одно и тоже, только права расширенные.

Intent Service по определению не связаны с приложением, работают в разных потоках, но и выполняют другую функцию.

 

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

Добавил вопрос на stackoverflow и сразу же начали минусить ) То ли за проблему не считают, то ли мой английский настолько плох, что ничего не понятно ))

Ссылка на комментарий
  • 0
9 минут назад, Rusland сказал:

Добавил вопрос на stackoverflow и сразу же начали минусить ) То ли за проблему не считают, то ли мой английский настолько плох, что ничего не понятно ))

Лучше указать параметры SDK, с которыми компилируешь приложение, и платформу на которой тестируешь.

И, если честно, по-русски не очень понятно, что ты имеешь ввиду. А гугл транслятор справиться с переводом сам.

Я плюсанул )

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

Спасибо

В SDK Manager вижу следующее: SDK 24.3.3 

SDK Base path: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows

SDK API Level: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\platforms\android-22

NDK Base path: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-ndk-r9c

NDK API Location: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-ndk-r9c\platforms\android-14

Насколько помню все настройки для Берлина брал из Сиэтла.

Ссылка на комментарий
  • 0
2 минуты назад, Rusland сказал:

Спасибо

В SDK Manager вижу следующее: SDK 24.3.3 

SDK Base path: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows

SDK API Level: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\platforms\android-22

NDK Base path: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-ndk-r9c

NDK API Location: C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-ndk-r9c\platforms\android-14

Насколько помню все настройки для Берлина брал из Сиэтла.

Да я про Stack Overflow написал. Ну здесь тоже может кто-то посоветует полезное.

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

Всем кто в сервис передает параметры, типа:

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;

 

Ссылка на комментарий
  • 0
19 часов назад, Rusland сказал:

обязательно проверяйте Intent на nil !

Ты молодец!

На эту проблему потрачено неимоверно много времени, и не мной одним.

В итоге, действительно проблема решилась.

Всегда молодым программистам по 100 раз говорю — Проверяйте объекты на NULL! Простое условие "if not Assigned(Object)" сэкономит кучу времени. — и сам же в это болото залез.

 

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

Коллеги, всем доброе время суток.

В действительности как решили эту проблему? Подкидывая сдк по примеру Pax Beach  проблема не ушла.

Делаю сервис Remote

запускаю через интент в хост приложении

тушу приложение через диспетчера

запускаю приложение - --- not responding

Гугл нем почему-то....

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

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

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

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

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

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

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

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

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

×
×
  • Создать...