앱에서 초기화 작업을 FormCreate(또는 FormShow)에서 하게되면 구동시간이 길어지고, 오류가 발생하는 경우 앱이 정상구동되지 않을 수(검은화면만 표시) 있습니다.
그렇기 때문에 앱이 완전 구동된 이후에 초기화 작업을 진행하도록 하기 바랍니다.
앱 완전 구동 후 동작하기 위해서는 아래와 같은 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;