Перейти к содержанию

Вопросы

Приложение + служба.

В службе установлен флаг перезапуска в StrartCommand^

result := TJService.JavaClass.START_STICKY; // rerun service if host app stops

 

Проблема вот в чем. На экране главная форма хост-приложения.  На смартфоне внизу нажимаю кнопку Назад. Приложение закрывается.

Вижу в LogCat Андроида, что аварийно завершается служба. Андроид восстанавливает работу службы и запускает и службу и само приложение. Хотя Андроид не должен перезапускать host-приложение, а только службу.
 

Цитата

 

ActivityManager: Scheduling restart of crashed service "имя.моего.пакета/com.embarcadero.services.Служба" in 1000ms

ActivityManager: Start proc "имя.моего.пакета" for activity "имя.моего.пакета/com.embarcadero.firemonkey.FMXNativeActivity: pid=21460 uid=10315 gids={50315, 9997, 3003, 1028, 1015} abi=armeabi-v7a

 

 

Т.е. вижу, что поле выхода приложение со службой работают.

Когда с рабочего стала ланчера запсукаю host-приложение, то оно виснет при старте и даже событие OnCreate главной формы не срабатывает. Показывается стартовое окно (splash) и висит, пока Андроид не предложит закрыть или подождать. И так несколько раз приходится делать, пока приложение не запустится.

Я в OnClose главной формы разные параметры прописывал для action, но толку нет.

Хоть какой-нибудь костыль посоветуйте, пожалуйста.

 

А когда нажимаю кнопку Домой на смартфоне, то приложение сворачивается и тогда запсу с рабочего стола ланчера происходит нормально, т.е. приложение просто всплывает.

Может можно как-то при закрытии приложения не закрывать его, а сворачивать?

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

Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0
procedure CloseApp;
begin
{$IFDEF ANDROID}
  TAndroidHelper.Activity.moveTaskToBack(true);
  // MainActivity.finish;
{$ELSE}
  Application.Terminate
  // Application.MainForm.Close;
{$ENDIF}
end;

 

 

procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  inherited;
  if Key in [vkEscape, vkHardwareBack] then
  begin
    CloseApp;
    Key := 0;
  end;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо. Работает.

Но это спасает, только если приложение штатно закрываешь.

Бывает, что в приложении случается исключение и оно тихонько само закрывается и даже не выдает никаких ошибок. В этом случае как быть?

Т.е. нужно как-то решать проблему на старте.

Это очень неудобно, когда приложение безо всяких сообщений закрывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, x11 сказал:

Бывает, что в приложении случается исключение и оно тихонько само закрывается и даже не выдает никаких ошибок. В этом случае как быть?

 ну значит нужно писать чтобы не было исключении)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Когда я, в самом начале изучения, смотрел примеры и видео по службе с host-приложением, которые реализованы в FMX, то там было видно, что при закрытии приложения, оно автоматически не стартует, а просто служба сама продолжает работу. Т.е. приложение можно запускать и завершать отдельно, при этом служба продолжает работу. А тут получается так, что при аварийном или принудительном завершении host-приложения Андроид автоматически запускает это host-приложение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Наверное, я сам виноват в проблемах с перезапуском host-приложения.

Доигрался...

Пытался добавить в проект службы доп. файлы и получилось так, что в dpr-проект host-приложения добавил в USES несколько файлов из проекта службы. Получилась путаница.

Удалил некорректные ссылки в USES host-приложения. Пока полёт перезапуск нормальный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.02.2018 в 14:06, x11 сказал:

Пока полёт перезапуск нормальный.

 

Я ошибался.

Если вываливается исключение и приложение падает, то потом всё равно при запуске виснет :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 16.02.2018 в 10:46, Равиль Зарипов (ZuBy) сказал:

 ну значит нужно писать чтобы не было исключении)

А разве ОСь не завершает приложения по своему желанию, оставляя только скрин последнего состояния в диспетчере?  Вроде делает именно так

 

В 13.02.2018 в 23:09, x11 сказал:

Когда с рабочего стала ланчера запсукаю host-приложение, то оно виснет при старте и даже событие OnCreate главной формы не срабатывает. Показывается стартовое окно (splash) и висит, пока Андроид не предложит закрыть или подождать. И так несколько раз приходится делать, пока приложение не запустится.

У нас такая же беда. Грешили на Эмбу. Написали сервис на Яве. Пару дней было норм. Уже поверили в чудо - но нет. Все так же...  Ищем решение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


  • Похожий контент

    • От Евгений Корепов
      Я написал класс для демонизации приложения в linux. Класс форкает процесс, обрабатывает поступающие сигналы и передает их в основной поток через потокобезопасную очередь.
      Исходники https://github.com/EvgeniyKorepov/LinuxDaemon
      Для использования просто подключите модуль UnitDaemon в свое консольное приложение:
      program DaemonTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemon in 'UnitDaemon.pas'; var AEventType : TEventType; begin syslog(LOG_NOTICE, 'main START'); while True do begin syslog(LOG_NOTICE, 'main LOOP'); if UnitDaemon.QueueEvent.PopItem(AEventType) = System.SyncObjs.TWaitResult.wrSignaled then begin syslog(LOG_NOTICE, 'main UnitDaemon.QueueEvent.PopItem'); case AEventType of TEventType.StopProcess : begin syslog(LOG_NOTICE, 'main Event StopProcess'); ExitCode := EXIT_SUCCESS; exit; end; TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; exit; end; end; end; Sleep(50); end; end. Так же поддерживается systemd - для этого положите  DaemonTest.service в /etc/systemd/system/ и используйте :
      systemctl start DaemonTest.service systemctl reload DaemonTest.service systemctl stop DaemonTest.service  
    • От Евгений Корепов
      Вот просто идеальная статья по запуску демона под Linux http://blog.paolorossi.net/2017/09/04/building-a-real-linux-daemon-with-delphi-part-2/ 
      Помимо объяснения механизма fork с отличными примерами,  есть куча дополнительной наиполезнейшей инфы.
    • От x11
      Это не вопрос. Просто подумал, что кому-нибудь может пригодится.
      https://forums.embarcadero.com/thread.jspa?threadID=118465
      Используем 2 файла: Androidapi.JNI.ToastForService.pas + FlyUtils.Android.PostRunnableAndTimer.pas.
      Пример вызова:
      Androidapi.JNI.ToastForService.PostToast('текст сообщения', LongToast); Проверил - работает.
      Есть ещё третий параметр "UseLastToastObj", но я так и не понял, для чего он. Документации нет.
    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От x11
      Как проверить, работает ли моя служба?
      Т.е. перед запуском или остановкой хочется выполнить проверку.
       
      FService := TJIntent.Create; FService.setClassName(TAndroidHelper.Context.getPackageName, TAndroidHelper.StringToJString('com.embarcadero.services.pak1')); FService.setAction(StringToJString('StopService')); TAndroidHelper.Activity.startService(FService);  
    • От x11
      На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
      http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
      http://fire-monkey.ru/topic/2386-перехват-события-звонка/
      http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
      Покритикуйте пожалуйста. Уверен, что не всё правильно.
      Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
      Проект (для Токио) приложил теме.
      Заранее благодарен.
       
      BR2.rar
    • От x11
      Заметил, что после удаления библиотеки-сервиса всё равно в host-приложении остаётся мусор.

    • От x11
      Прошу помощи или хотя бы совета.
      Кто-то уже пытался создать службу, которая может перехватывать звонки входящие и исходящие?
      Пример для обычного приложения есть с таким кодом
      TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService)); if Assigned(PhoneDialerService) then PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;  
      Плюс пытаюсь всё это скрестить с NotificationCenter, но служба при запуске зависает и падает.
       
       
    • От x11
      Экспериментировал с сервисами.
      После переименования проекта библиотеки сервиса удалил и снова хочу добавить к host-проекту библиотеку-service.
      На первом шаге выбираю "Искать автоматически". На втором выбираю папку, где живет проект-библиотека, но среда ругается и выдает старое имя. Но я не могу найти, где именно среда находит это старое имя.


    • От x11
      Использую стандартный пример из папки
      C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\AndroidNotificationServiceDemo\NotificationService
      Delphi Tokyo.
      Компилируется и запускается на устройстве. Нажимаю кнопку Start service, но ничего не происходит. Т.е. совсем ничего: ни ошибок, ни падений приложения, никаких сообщений.
      В какую строну копать?
      И вообще, как проверить, работает ли мой сервис?
       
      Я от крыл в настройках андроида "Запущенные программы", но там нет даже моего приложения в списке, хотя приложение запущено.
      Пробовал на Андроид версий 5 и 6.
  • Последние посетители   0 пользователей онлайн

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

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