본문 바로가기

Program/Delphi-FireMonkey

[Delphi-FireMonkey] 안드로이드(Android) 뒤로가기 버튼 두번 눌러서 종료

 안드로이드에서 뒤로가기 버튼을 두번 눌렀을 경우 종료되는 것을 델파이로 만들어 보았다. 자바로 구현된 소스처럼 시간을 체크하여 동작을 처리한다. 구조 역시 비슷하게 만들었다.

 

 뒤로가기 버튼을 두번 눌렀을 경우 종료가 되는 동작을 처리하는 uBackPressCloseHandler.pas 파일 생성.

unit uBackPressCloseHandler;
interface
uses  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,  FMX.Types, FMX.Controls, FMX.Forms,  FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;
type  TBackPressCloseHandler = class(TObject)    backKeyPressedTime : Integer;
  private    Fform : TForm;    FJContext : JContext;  protected
  public    constructor Create(pForm: TForm; pActivityContext: JContext);    property targetForm : TForm read Fform write Fform;    property targetActivityContext : JContext read FJContext write FJContext;
    procedure onBackPressed;  end;

implementation
uses  Androidapi.JNI.Toast;
{ TBackPressCloseHandler }
constructor TBackPressCloseHandler.Create(pForm: TForm; pActivityContext: JContext);begin  Fform := pForm;  FJContext := pActivityContext;  backKeyPressedTime := StrToInt(FormatDateTime('DDyynnss', Now())) - 2;end;
procedure TBackPressCloseHandler.onBackPressed;var  tempToast : JToast;begin  if Assigned(Fform) then  begin    if StrToInt(FormatDateTime('DDyynnss', Now())) > backKeyPressedTime + 2  then    begin      backKeyPressedTime := StrToInt(FormatDateTime('DDyynnss', Now()));
      CallInUiThread(procedure      begin        tempToast := TJToast.JavaClass.makeText(FJContext,          StrToJCharSequence('''뒤로''버튼을 한번 더 누르시면 종료됩니다.'), TJToast.JavaClass.LENGTH_SHORT);        tempToast.show;      end);
      Exit;    end;
    if StrToInt(FormatDateTime('DDyynnss', Now())) <= backKeyPressedTime + 2 then    begin      Fform.Close;    end;  end;end;
end.

 

 해당 Form에서 uBackPressCloseHandler.pas 파일을 uses절에 불러놓고, BackPressCloseHandler 클래스변수를 정의.

type  TForm1 = class(TForm)    procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;      Shift: TShiftState);    procedure FormCreate(Sender: TObject);  private    { Private declarations }    BackPressCloseHandler : TBackPressCloseHandler;

.....

.....

.....

 

 Form 생성시 OnCreate 이벤트에서 

BackPressCloseHandler을 생성자로 메모리 할당.

procedure TForm1.FormCreate(Sender: TObject);begin  BackPressCloseHandler := TBackPressCloseHandler.Create(Self, SharedActivityContext);end;

 

 뒤로가기 버튼이 눌렸다 떼어졌을 때 BackPressCloseHandler의 onBackPressed 프로시저 호출.

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;  Shift: TShiftState);begin  if Key = vkHardwareBack then  begin    Key := 0;
    BackPressCloseHandler.onBackPressed;  end;end;