воскресенье, 27 октября 2013 г.

Как закрыть приложение при помощи кнопки TButton или TSpeedButton

На данный момент тема "закрыть android приложение для Android с помощью кнопки(TButton или TSpeedButton)", очень актуальна. Я провёл тестирование некоторых способов и теперь подведу итог.

Upd (23.04.14). Проверено на Delphi XE6


Способы закрытия приложения:
  1. Halt(0); - Работает
  2. Form1.Close; - Не работает
  3. Application.Terminate; - Не работает
  4. MainActivity.finish; - Работает
Для того чтобы использовать последний способ, нужно написать примерно такой код:
uses 
  FMX.Platform.Android;

procedure TForm1.Button4Click(Sender: TObject);
begin
  MainActivity.finish;
end;

Решать вам, какой из работающих способов использовать.

15 комментариев:

  1. Не знаю как у кого а у меня етот код вырубает ємулятор

    ОтветитьУдалить
    Ответы
    1. Весь представленный в блоге код является полностью рабочим и проверенным на реальном устройстве (иногда даже не на одном…).

      Удалить
    2. Вот еще вариант
      FreeAndNil(Application);

      Удалить
  2. Приложение закрывается и в след выходит сообщение (уведомление)

    "Приложение ХХХ остановлено."

    Как мне предотвратить это уведомление ?

    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Проверил на XE7 + Andorid 4.4.2. Вариант с MainActivity.finish отлично работает. Ищите ошибку у себя в коде, попробуйте запустить приложение в дебаг режиме и отловить эту ошибку.

      Удалить
    2. На пустом приложение да, работает,
      Ну вот я элементарно выполняю один код ...

      Memo1.Text:=idHTTP1.Get('http://google.com/');

      И когда закрываю то выходит с ошибкой ... Ну я как то решил эту проблему, делаю вот так ....

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

      И всё, выходит без ошибки ..... Правда странный код ...

      Удалить
    3. Что-то мне подсказывает, что ваше решение – это костыль.
      Начну с того, что у меня есть приложения с кучей процедур/функций и с кнопкой «Выход», нигде такой проблемы не наблюдается. Далее, работа со строчками в Мемо давно изменилась, теперь для доступа используйте Memo1.Lines, а не Memo1.Text (в справке об этом написано http://docwiki.embarcadero.com/Libraries/XE7/en/FMX.Memo.TMemo.Text). Шагаем дальше, я сделал приложение, получающее страничку яндекса в мемо.
      В приложении я использовал ваш способ и правильный способ (в соответствии со справкой), вот код:

      uses
      FMX.Platform.Android;

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add(IdHTTP1.Get('http://yandex.ru/'));
      end;

      procedure TForm1.Button2Click(Sender: TObject);
      begin
      MainActivity.finish;
      end;

      procedure TForm1.Button3Click(Sender: TObject);
      begin
      Memo1.Lines.Clear;
      Memo1.Text := IdHTTP1.Get('http://yandex.ru/');
      end;

      Как бы я не старался, но повторить вашу ошибку мне не удалось. В связи с этим, делаю вывод, что проблема в вашем коде/среде разработки.

      Удалить
    4. С гуглом тоже всё работает, только компонент для работы с ssl добавить надо и всё.

      Удалить
    5. Этот комментарий был удален автором.

      Удалить
    6. Я работаю на Delphi XE6. Запустил его создал новый проект и написал это ...

      uses
      FMX.Platform.Android;

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add(idHTTP1.Get('http://XXX.com/'));
      end;

      procedure TForm1.Button2Click(Sender: TObject);
      begin
      MainActivity.finish;
      end;


      Всё равно, при закрытии приложения, приложение закрывается и в след выходит ошибка/уведомление .....

      http://saveimg.ru/show-image.php?id=1cbcbf8b468128e45e727fbc54f8e1a3

      Удалить
    7. Отловите ошибку в monitor.bat и возможно станет понятно, что происходит не так как надо...

      Удалить
  3. Я сделал как вы написали Memo1.Lines.Add(IdHTTP1.Get('http://yandex.ru/')); но всё равно та же самая ошибка выходит ... Ну в коде не понимаю как может быть проблема когда всё работает .... А что ты имеете ввиду под словом .... (проблема в вашем среде разработки.)

    В смысле в среде ? Спасибо.

    ОтветитьУдалить
    Ответы
    1. Возможно, в версии XE6 был какой-то баг, связанный с вашей проблемой (попробуйте поискать в QC). Хотя я проверял код для закрытия приложения и на XE6. Даже и не знаю, что ещё вам подсказать...

      Удалить
    2. Да, уж, не понятно что то ..... Но всё равно спасибо .... Я установлю, XE7 и проверю на нём .... Я напишу о результате, благодарю за ваше уделение внимания... Спасибо ...

      Удалить
    3. Я установил Delphi XE7 и скомпилировал тот же самый код, но на сей раз ошибки не было при выходе из программы ...
      Да, вы были правы проблема кажется в среде XE6 ... Благодарю за внимание ...

      Удалить