• 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? в результате чего не выгружается полностью. Вышеуказанный код надо использовать как при выходе из приложения, так и при переходе из формы в форму. В чем по вашему мнению может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 ответа на этот вопрос

  • 0

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Собирите пример и выложите с описанием, как получить ошибку. Тогда посмотреть можно будет. А так гадание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

на эмуляторе под отладчиком в каком месте вылетает смотрел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

да очень часто эти .finish не помогают.

лучше просто все сохранить и убить нафиг процесс. что бы наверняка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

смотри процессы запущенные а не историю запуска. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Close() - работает, делает похоже, тоже самое, что и MainActivity()->finish().

 

У меня в С++ Builder XE7 работает.

Поделиться сообщением


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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Решил проблему установкой XE8. Сейчас тот же самый код работает. Наверное была проблема в самой среде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Alex Bakulin
      Создаю стандартное мобильное приложение, которое предлагает Delphi Berlin. Там есть обработчик кнопки Назад. Собственно у меня задача, после того, как человек перешел в какой-то из режимов приложения, на эту кнопку реагировать, а именно присваивать Key := 0 и делать Application.Terminate. Но это не срабатывает, пролистываются все экраны приложения до первого и только после этого идет выход...
      Возможно я что-то не так для Андроид использую. Как мне закрыть приложение по этой кнопке? 
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу