Como encerrar uma aplicação no dispositivo Android através de uma Caixa de Diálogo simples com Delphi XE5. Evitando que o usuário saia da aplicação por acidente.

Situação a que se aplica

Imagine aquela situação em que o usuário está com seu dispositivo móvel na mão e acaba esbarrando sem querer na tecla voltar, que ao ser tocada finaliza a aplicação que ele estava interagindo. A solução abordada nesta postagem visa solucionar este pequeno contratempo que nossos usuários podem fatidicamente estar sujeitos.

Screenshot_2014-07-26-14-00-11

MessageDlg: Funciona ou não???

Desenvolvedor Delphi de longa data tem conhecimento da função MessageDlg. Na VCL publicada na unit Dialogs, a função é capaz de retornar para a aplicação o valor da resposta dada pelo usuário a uma determinada pergunta na caixa de mensagem.  Veja abaixo um exemplo da sua utilização em aplicações VCL:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if MessageDlg('Esta é a MessageDlg. Você já a conhecia?',
    mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then

end;

Um pouco mais sobre MessageDlg você pode encontrar na Embarcadero DocWiki e uma ótima referência também é encontrada na Delphi Basics.

Entretanto ao tentar fazer uso da MessageDlg na plataforma mobile (Firemonkey) digitando e compilando seu código, recebemos a mensagem de erro: “Undeclared identifier” para os tipos e botões da caixa de mensagem como pode ser observado na imagem abaixo:

Erro ao compilar MessageDlg

Então para solucionar este caso, ao utilizarmos MessageDlg para desenvolvermos  Mobile no Delphi XE5  devemos declarar este tipos com Namespaces completos como: TMsgDlgTypeTMsgDlgBtn. Veja abaixo como ficaria a declaração da função:

MessageDlg('Deseja realmente fechar a aplicação?',
        TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 
        0, TMsgDlgBtn.mbNo)

 Definindo a Interface do Usuário

Para colocarmos em prática o que realmente é proposto no título da postagem vamos iniciar um novo projeto Mobile em branco no Delphi XE5. Como já fizemos em diversas postagens aqui no blog. Neste projeto vamos inserir 1 Button e 1 TImage, e vamos alterar suas propriedades como a lista abaixo:

  • Button1
    • Align -> alBottom
    • Text -> ‘Sair’
    • TextAlign -> taCenter
  • Image1
    • Align -> alClient
    • MultiResBitmap -> [selecione uma imagem de sua preferência]
    • WrapMode -> iwStretch

Com isso definimos a interface de usuário da aplicação, ao final teremos algo muito próximo da imagem abaixo:

Interface do Usuário da Aplicação

Na prática: Permitir o encerramento da aplicação apenas através de uma confirmação do usuário.

A ideia é que o usuário ao clicar no botão sair chame o método Close da aplicação, e no evento onCloseQuery faremos o tratamento da resposta do usuário à nossa MessageDlg. Vamos codificar essa ideia.

No clique do botão insira o código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

Para podermos fazer uso da função do Android de encerrar a Activity da Aplicação precisamos declarar o Namespace FMX.Helpers.Android na cláusula uses da seção implementation da Unit de nosso formulário:

implementation

uses FMX.Helpers.Android;

{$R *.fmx}

Já o evento onCloseQuery do nosso formulário,  vamos codificar como a seguir:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if MessageDlg('Deseja realmente fechar a aplicação?',
        TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, TMsgDlgBtn.mbNo) = mrYes  then
   begin
      CanClose := True;
      SharedActivity.finish
   end
 else
  begin
    CanClose := False;
    ShowMessage('Você respondeu não');
  end;
end;

Note que temos até aí puro código Delphi, a exceção da linha SharedActivity.Finish. Que vem nativamente do Android sendo responsável por retirar nosso apk de execução.

Até a próxima e confira o resultado na galeria de fotos abaixo.

Comente