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

Как правильно раз в минуту мониторить (http) в сервисе?


fsdb

Вопрос

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

как мне правильно организовать это? когда приложение работает то все ок. как только приложение закрывается - уведомления перестают идти. хотя сервис продолжает работать. почему после запуска потока дебагер остается в бесконечном потоке и нет брекпоинта на Result?????? после рестарта ОС, сервис стартовавший автоматически - не выводит никаких сообщений вообще....

unit Unit1;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Android.Service,
  AndroidApi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os, System.Notification;





/////////////////////////////////////////////////////////////
// Основной поток Execute


type
  TExecuteThread = class(TThread)
  private
  protected
    procedure Execute; override;
  public
  end;

// Основной поток Execute
/////////////////////////////////////////////////////////////





type



  TAndroidServiceDM = class(TAndroidService)
    NotificationCenter1: TNotificationCenter;
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
  private
    { Private declarations }

  procedure LaunchNotification(title,body:string);

  public
    { Public declarations }
  end;

var
  AndroidServiceDM: TAndroidServiceDM;


implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}


uses
  Androidapi.JNI.App, System.DateUtils;




procedure TAndroidServiceDM.LaunchNotification(title,body:string);
var
  MyNotification: TNotification;
begin

  MyNotification := NotificationCenter1.CreateNotification;
  try
    MyNotification.Name := 'PanelControl';
    MyNotification.Title := title;
    MyNotification.AlertBody := body;
    MyNotification.FireDate := IncSecond(Now, 0);
    NotificationCenter1.ScheduleNotification(MyNotification);
  except
    MyNotification.Free;
  end;
end;




procedure TExecuteThread.Execute;
begin
  { Place thread code here }

  while true do begin

  Unit1.AndroidServiceDM.LaunchNotification('Запуск','Успешная работа сервиса');
  sleep(1000);

  end;
end;



function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;

var
MyExecuteThread: TExecuteThread;
begin



MyExecuteThread:=TExecuteThread.Create(false);
MyExecuteThread.FreeOnTerminate:=true;
MyExecuteThread.Resume;



Result := TJService.JavaClass.START_STICKY;



end;





end.

 

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

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

  • 0
В 18.03.2016в21:18, fsdb сказал:

после рестарта ОС, сервис стартовавший автоматически - не выводит никаких сообщений вообще....

После рестарта ОС сервис сам по себе не перезапуститься. Прочтите статью Андрея Ефимова

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

делайте push уведомления  я также бился над вопросом сервиса но отказался push гораздо проще и менее затратно в плане ресурсов телефона

не нужн мониторинг сервер постоянно достаточно скрипта который  будет работать на сервере по крону или при определенном условии отправлять push

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

Rusland,

автостарт я делал по этой статье. тут суть что уведомления не сыпятся. никак

 

master webs

про  push  - все бы ничего но мне нужна двусторонняя связь. например я возле дома . сервис в фоне определил мои координаты и послал http запрос. 

не подходит push под мои задлачи

 

 

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

если в фоне будете определять координаторы gps  приложение будет жрать батарею ужасно быстро да и если так   что мешает отправить данные серверу который потом отправит пуш уведомление кому нужно

не совсем понятна задача.

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

master webs - я не против пуш уведомлений но * что мешает отправить данные серверу * - у меня в сервисе как раз не получается при не запущеном приложении. тем более мои координаты по мере движения меняются. и возникает задача снова их отправить. вообще по любому нужно разбираться с сервисом.

umkes, а как я буду повторять и повторять свою задачу если я разрешу выйти из цикла. по идее это же поток. он должен выполняться параллельно.

 

Батарея для меня дело скажем последнее. переодичность можно настроить когда все работать. тут ведь дело какое. сервис после рестарта ОС - работает но ничего не делает в потоке. и работает с уведомлениями только когда приложение запущено. самостоятельно не хочет ничего.

 

 

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

Я бы делал по другому. 

Сначала запуск AlarmManager с интервалом 1 минуту, или сколько там нужно. 

Он шлет intent сервису. А сервис с Start_Not_Stycki просто делает задачку и завершает свою работу.

 

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

umkes, да так наверное сработает

Давайте подождем ответа еще админа или модератора. надеюсь расскажут. уж больно не понятно все же про потоки. кто нибудь компитентный объясните как сделать постоянную обработку (в бесконечном цикле) в сервисе нормально???

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

попробывал создать интентсервис - тоже пока не получается. не хватает опыта. через локалсервис точно не получится. об этом написано .. что это часть приложения а не отдельный поток. ну я так понял

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

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

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

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

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

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

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

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

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

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

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