본문 바로가기

파이어몽키

앱 완전 구동 후 작업 수행 하기(라이프 사이클 이벤트 / 타이머 이용)

앱에서 초기화 작업을 FormCreate(또는 FormShow)에서 하게되면 구동시간이 길어지고, 오류가 발생하는 경우 앱이 정상구동되지 않을 수(검은화면만 표시) 있습니다.


그렇기 때문에 앱이 완전 구동된 이후에 초기화 작업을 진행하도록 하기 바랍니다.

앱 완전 구동 후 동작하기 위해서는 아래와 같은 2가지 방법이 있습니다.

  1. 모바일 앱 라이프 사이클 이용하기
  2. 타이머를 이용해 구동 이후 이벤트 받아 처리하기

모바일 앱 라이프 사이클 이용하기

모바일(안드로이드, iOS)는 라이프 사이클 이벤트를 제공합니다.(http://blog.hjf.pe.kr/114 참고)

아래 코드를 참고하기 바랍니다.

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Platform;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FInit: Boolean;
    procedure InitData;

    function HandleAppEvent(AAppEvent: TApplicationEvent;
      AContext: TObject): Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
var
  EventService: IFMXApplicationEventService;
begin
  FInit := False;
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(EventService)) then
    EventService.SetApplicationEventHandler(HandleAppEvent)
  else
    InitData;
end;

function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  case AAppEvent of
    TApplicationEvent.FinishedLaunching, 
    TApplicationEvent.BecameActive:
        InitData;
  end;
  Result := True;
end;

procedure TForm1.InitData;
begin
  if FInit then
    Exit;

  // 데이터 및 컨트롤 초기화

  FInit := True;
end;

end.


참고로 FinishedLaunching 이벤트가 iOS에서 발생하지 않습니다. 그래서 iOS의 경우 BecameActive 이벤트를 이용해 초기화 진행했습니다.

BecameActive 이벤트는 앱 활성화 될 때 마다 발생하기 때문에 중복방지 코드(if FIni then Exit;)를 추가했습니다.

타이머를 이용해 구동 이후 이벤트 받기

타이머(TTimer) 컴포넌트를 폼에 추가 후 실행하면, 앱이 구동된 이후 타이머 이벤트가 발생합니다.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  InitData;
end;

관련글