androiddelphiback-buttondelphi-xe5

How do I handle a back-button press in a (Delphi) Android app?


How can I make my Android app react to the back-button?

Is there something as high-level VCL's TApplicationEvents to handle it, or do I need to dive deep into low-level Android-specific stuff here?

Right now, most of the demo applications have an on-screen back button to go back to a previous screen. Pressing the psysical button always seems to quit the app, and in some situations it results in an access violation.


Solution

  • In the form's OnKey... events, the Key parameter is vkHardwareBack on Android. For example:

    uses
      FMX.Platform, FMX.VirtualKeyboard;
    
    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    var
      FService : IFMXVirtualKeyboardService;
    begin
      if Key = vkHardwareBack then
      begin
        TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
        if (FService <> nil) and (vksVisible in FService.VirtualKeyBoardState) then
        begin
          // Back button pressed, keyboard visible, so do nothing...
        end else
        begin
          // Back button pressed, keyboard not visible or not supported on this platform, lets exit the app...
          if MessageDlg('Exit Application?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1) = mrOK then
          begin
            // Exit application here...
          end else
          begin
            // They changed their mind, so ignore the Back button press...
            Key := 0;
          end;
        end;
      end
      ...
    end;