在Delphi中使用Android服务进行iTask

时间:2018-01-14 09:38:07

标签: android delphi service firemonkey access-violation

我开发了一个Android应用程序,其中有一个服务在后台工作,工作是发送有关当天所有集合点的通知。 在主要的应用程序onCreat甚至我创建了服务表单:

Application.CreateForm(TTservice, Tservice);

我创建了一个Tswitchbutton来启动服务并停止它:

 if switchnotificationenable.IsChecked then
var
Fservice : TLocalServiceConnection;
    begin
      Fservice := TLocalServiceConnection.Create;
      Fservice.StartService('TheService');
    end;

和服务事件OnstartCommande中的另一个代码:

Result := TJService.JavaClass.START_REDELIVER_INTENT;

调试违规时Access指向代码:

Fservice.StartService('TheService');

错误通常意味着我正在调用的内容不存在我能够访问我服务表单上的计时器,所以我不知道会出现什么问题。

我希望你们能帮助我找到解决方案。

我正在使用带有sqlite数据库的Delphi XE10.2 tokyo,

每个人都过得愉快!

更新

我发现当我从项目中删除服务的file.jar时,违规访问错误消失但服务无法启动。

----- ----- UPDATE 在发现我无法使用TTimer来创建我的推送通知之后,我正在考虑使用一个循环来实现iTask,如果系统时间等于主应用程序中给出的时间,则使用sleep函数检查每30秒用户

procedure TDM.AndroidServiceCreate(Sender: TObject);
var
  ntf : Jnotification;
  today : Ttime;
  mynotification : Tnotification;
  notiftime : TTime;
  T : iTask;
  TheINIFIle : string;
  config : Tstringlist;

begin
// Loading the database path and the time given by the user in the main apps who are saved in A Ini file
  TheINIFILE := TPath.Combine(TPath.GetSharedDocumentsPath ,'NotificationParams.ini');
  if FileExists(TheINIFILE) then
  begin
    config := Tstringlist.Create;
    config.loadfromfile(TheINIFILE);
    notiftime := strtotime(config.Values['TimeNotification']);
    TimerConnection.Database := config.Values['DatabasePath'];
    TimerConnection.Connect;
    // creating the iTask and giving it code that create notifications everytime the system time is equal to the notification time
    if TimerCOnnection.Connected = true then
    begin
      T := TTask.Run(procedure
      begin
        while Checking = true do
        begin
          sleep(30000);
          today := time;
          with QueryForNotification do
          begin
            SQL.Clear;
            SQL.Add('select client.entreprise, RDV.date_ntf, RDV.date_rdv, Client.num_C from client, Rdv where client.num_c = rdv.num_c and rdv.Date_Ntf = date(''now'')');
            Open;
            First;
            while not eof do
            if sametext(fieldvalues['date_ntf'], FormatDateTime('yyyy-mm-dd', now)) then
            begin
              MyNotification := TheNotifications.CreateNotification;
              try
               if sametext(formatdatetime('HH-MM',NotifTime),formatdatetime('HH-MM',today)) then
                 begin
                   MyNotification.AlertBody := 'Le RDV avec ' + FieldValues['entreprise'] + ' vous attend!' ;
                   TheNotifications.ScheduleNotification(MyNotification);
                 end;
              finally
                next;
                MyNotification.DisposeOf;
              end;
            end;
          end;
        end;
      end);
    end;
  end;
end;

0 个答案:

没有答案