Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 FMX_Android 」

「 バックボタンで終了させない 」

バックボタンで終了させない


回答

ソース

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.Layouts, FMX.Memo, System.Math.Vectors, FMX.Types3D,
  FMX.StdCtrls, FMX.Controls3D, FMX.MaterialSources, FMX.Objects3D,
  FMX.Viewport3D 
  ,FMX.Platform//TPlatformService
  ,FMX.VirtualKeyboard //IFMXVirtualKeyboardService
  ,FMX.Platform.Android //MainActivity
  ;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Viewport3D1: TViewport3D;
    Model3D1: TModel3D;
    Model3D1Mat01: TLightMaterialSource;
    Model3D2: TModel3D;
    Model3D2Mat01: TLightMaterialSource;
    Light1: TLight;
    Dummy1: TDummy;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
      Shift: TShiftState);
  private
    { private 宣言 }
  public
    { public 宣言 }
    function HandleAppEvent(AAppEvent:TApplicationEvent;AContext:TObject):boolean;
    procedure Log(s:String);
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.fmx}
procedure TForm2.Log(s: string);
begin
  Memo1.Lines.Add(TimeToStr(Now) + ': ' + s);
end;
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  Dummy1.AnimateFloat('RotationAngle.Y',360,2);
end;
 
procedure TForm2.FormCreate(Sender: TObject);
var
  AppEventService:IFMXApplicationEventService;
begin
  //Viewport3D1.Visible:=True;
  //IInterface(AppEventService)
 
  if
    TPlatformServices.Current.SupportsPlatformService(
      IFMXApplicationEventService
    )
  then
  begin
    try
      AppEventService:=
        IFMXApplicationEventService(
          TPlatformServices.Current.GetPlatformService(
            IFMXApplicationEventService
          )
        );
    except
      AppEventService:=nil;
    end;
    //AVD(仮想環境)でデバッグモードで下記を実行すると、非アクティブ時等に落ちる
    //iOSでもAndroidでもちゃんと動くらしい
    //当然Windowsの場合は以下が実行されない
    if AppEventService<>nil then
      AppEventService.SetApplicationEventHandler(HandleAppEvent);
  end
  else
  begin
    //Windowsの場合は以下が表示される
    Log('Application Event Service is not supported.');
  end;
 
end;
 
procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
var Keyboard:IFMXVirtualKeyboardService;
begin
  //Androidのbackキーを処理する
  if Key=vkHardwareBack then
  begin
    keyboard:=TPlatformServices.Current.GetPlatformService(
      IFMXVirtualKeyboardService
    ) as IFMXVirtualKeyboardService;
    if TVirtualKeyboardState.Visible in keyboard.VirtualKeyboardState then
      exit;
    MainActivity.moveTaskToBack(True);
    Key:=0;
 
  end;
end;
 
function TForm2.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): boolean;
begin
{
Finished Launching
Become Active
 
Entered Background
Will Become Inactive
Will Become Inactive
 

Will Become Foreground
Became Active
 
}
 
  case AAppEvent of
    TApplicationEvent.FinishedLaunching:
    begin
      //起動完了
      Log('Finished Launching');
    end;
    TApplicationEvent.BecameActive:
    begin
      //フォーカスを取得-------------------------------------
      Log('Became Active');
      Viewport3D1.Visible:=True;
    end;
    TApplicationEvent.WillBecomeInactive:
    begin
      //フォーカス喪失-------------------------------------
      Log('Will Become Inactive');
      Viewport3D1.Visible:=False;
    end;
    TApplicationEvent.EnteredBackground:
    begin
      //裏に回った
      //Log('Entered Background');
      //Viewport3D1.Visible:=False;
    end;
    TApplicationEvent.WillBecomeForeground:
    begin
      //表に回った
      Log('Will Become Foreground');
    end;
    TApplicationEvent.WillTerminate:
    begin
      //終了しようとしている
      Log('Will Terminate');
    end;
    TApplicationEvent.LowMemory:
    begin
      //メモリが少ない
      //Log('Low Memory');
    end;
    TApplicationEvent.TimeChange:
    begin
      //iOSのみ時刻が変わった(日が変わったり夏時間などで)
      //Log('Time Change');
    end;
    TApplicationEvent.OpenURL:
    begin
      //iOSのみURLを開いた
      //Log('Open URL');
    end;
  end;
  Result := True;
 
  {
  //Androidの場合。IOSは違う。Delphiはこれらを吸収して上記のようになっているらしい
  onCreate  ⇒onStart
  onRestart ⇒onStart
  onStart   ⇒onResume or onStop
  onResume  ⇒onPause
  onPause   ⇒onResume or onStop
  onStop    ⇒onRestart or onDestroy
  onDestroy
 
  }
end;
 
end.

Copyright 2019 Mam