Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проблема при выходе из программы


Рагим

Вопрос

Добрый день. Пишу приложение на Delphi XE7 под Андроид. Код типа 

 

if Key = vkHardwareBack then
begin
// Do whatever you want to do here
Key := 0; // Set Key = 0 if you want to prevent the default action
end;

 

отлично работал в XE6 и перестал работать после обновления. Приложение выполняет все что находится до строки Key:=0, а потом закрывается. Причем не закрывает подключения TIdTCPServer? в результате чего не выгружается полностью. Вышеуказанный код надо использовать как при выходе из приложения, так и при переходе из формы в форму. В чем по вашему мнению может быть проблема?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Ошибки в коде нет. Даже если пишу просто 

if Key = vkHardwareBack then
begin
showmessage('Exit!');
Key := 0; 
end;

 

показывается сообщение, а потом вылетает. повторюсь на XE6 этот же код работает без проблем

Ссылка на комментарий
  • 0

[belov.V] Никакого "гадания" тут нет... Это далеко не первое обсуждение на данном форуме этой проблемы! Мало-мальски посложнее приложение и начнутся проблемы с его полным завершением.

 

Вот здесь есть решение

http://fire-monkey.ru/topic/1046-reshenie-segmentation-fault11-ili-axe-beats-in-the-balls/

Изменено пользователем Andrey Yefimov
Поправил ссылку
Ссылка на комментарий
  • 0

[AlexG], и все же я не просто так предложил, т.к. поведение приложения под Android очень сильно зависит от многих факторов, к примеру от того же файла манифеста (не утверждаю, что у Вас так). Я третью неделю бьюсь с задачей корректного (по моему) поведения приложения и отсутствия зависаний при переключении между разными activity одного приложения. Так даже без изменения кода можно добиваться совершенно разного поведения программы.

 

Кстати, так как FMX всегда возвращает ссылку на корневую активити. Пришла мысль завершать приложение с помощью:

SharedActivity.finish; 

Описания такого способа мне не попадалось. Но ради эксперимента подвесил на одно "тяжелое" приложений и те, с которыми играюсь сейчас. Пока вроде все корректно. Интересно у кого как, в особенности у кого были проблемы.

Изменено пользователем Belov.V.
Ссылка на комментарий
  • 0

[belov.V] Я согласен с Вашим подходом, что желательно добиваться "правильной" работы приложения при любых условиях. В т.ч. - даже если нам требуется просто закрыть приложение.

 

З.Ы. SharedActivity.finish; - попробую по возможности проверить все варианты и по результатам отпишусь.

Ссылка на комментарий
  • 0
  • Модераторы

Самое корректное завершение - это:

MainActivity.finish; или SharedActivity.finish;
Посмотрите вот эту заметку http://delphifmandroid.blogspot.ru/2013/10/tbutton-tspeedbutton.html, а также комментарии к ней.
Ссылка на комментарий
  • 0

Сказать о том, что надоело отсутствие справочной системы для с++, это ничего не сказать. :ph34r:

Как это будет на с++?

Спасибо.

uses
  FMX.Platform.Android;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  MainActivity.finish;
end;
#include <FMX.Platform.Android.hpp>
//***

MainActivity->Finish();

[bccaarm Error] MobUnit1.cpp(749): member reference base type 'Androidapi::Jni::Embarcadero::_di_JFMXNativeActivity () __attribute__((pcs("aapcs-vfp")))' is not a structure or union

Ссылка на комментарий
  • 0

 

да не пользуйся ты этой какой

К чему был ваш глубоко мыссленный и позновательный пост в моей теме?

 

Ответ по теме:

Если отключить компьютер от интернета, писать приложения для андроид на С++ Embarcadero просто не возможно. Интернет, нужен, чтобы найти решения на англоязычных форумах, а не среди справочной системы Embarcadero. Впрочем справочная система для С++ отсуствует.как класс Ну а мне помог снова англоязычный форум:

MainActivity()->finish();

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

Попробовав код MainActivity()->finish();

 

Возник вопрос, а зачем этот код нужен?

Я в коде, для примера, вызываю два варианта так:

void __fastcall TMainForm::Button2Click(TObject *Sender)
{
MainActivity()->finish();

Или так

void __fastcall TMainForm::Button2Click(TObject *Sender)
{
Close();

Оба варианта для меня равнозначны. Приложение закрывается, и я его затем вижу в приложениях, которые были запущены ранее. Для просмотра этих приложений я нажимаю соответствующую кнопку на тулбаре андроид устройства.

 

Как сделать, чтобы приложение полностью выгрузилось? Чтобы после нажатия кнопки закрытия приложения, его больше не было негде.

Или это не возможно? Зачем тогда MainActivity()->finish() если эффект Close() такой же?

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

MainActivity()->finish() или SharedActivity()->finish() должны выгружать приложение полностью (MainActivity.finish; - корневая активити, а SharedActivity.finish - ... пока к сожалению тоже только корневая).

 

То, что Вы видите приложение в списке не значит, что оно загружено. Это список загруженных ранее, а не находящихся в памяти. К примеру, чтобы в списке не оставался, есть ключ для файла манифеста android:noHistory="false".

Ссылка на комментарий
  • 0

Приложение закрывается, и я его затем вижу в приложениях, которые были запущены ранее. Для просмотра этих приложений я нажимаю соответствующую кнопку на тулбаре андроид устройства.

 

Как сделать, чтобы приложение полностью выгрузилось? Чтобы после нажатия кнопки закрытия приложения, его больше не было негде.

 

так а с чего вы решили, что оно не закрывается? вы его видите в истории ранее открытых приложений просто!

это разные кейсы!

Ссылка на комментарий
  • 0

Спасибо.

У меня при Close(), программа также успешно закрывается и затем видна в истории. Но исходя из выше сказаннного надо использовать для правильного закрытия именно MainActivity()->finish().

Просто внешне не видно разницы между Close() и MainActivity()->finish()...

Ссылка на комментарий
  • 0
  • Модераторы

Close не работало в XE5 и вроде в XE6 (я писал об этом в статье, по ссылке выше).

Сейчас проверил в XE8:

Close() - работает, делает похоже, тоже самое, что и MainActivity()->finish().

Получается теперь можно использовать обычный Close().

Ссылка на комментарий
  • 0
К чему был ваш глубоко мыссленный и позновательный пост в моей теме?

 

 

да и кстати, тема не твоя. а насчет моего поста - С++ сырой и об этом не раз писали уже не один человек. мало того сам огнеобезьян глючный еще с верху и с++ накладывается и получается трешь полный. но дело конечно ваше чем пользоваться. палкой никто не отгоняет.

Ссылка на комментарий
  • 0
  • Модераторы

Я не просто так давал ссылку в блог и советовал посмотреть комментарии. У человека была похожая проблема... Правда он переустановил с XE6 на XE7 и всё заработало. Видимо есть какой-то баг...

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...