앱에서 초기화 작업을 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;