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

Закрыть приложение


Ingalime

Вопрос

Когда пользователь нажимает на кнопку возвращения на главный экран телефона, приложение уходит в фон. Однако операционная система Андроид не сразу полностью выгружает приложение, свернутое в фон. Приложение, свернутое в фон может еще какое-то время работать – взаимодействовать с внешними устройствами, слать уведомления и т.п. Спустя время Андроид прибивает приложение.

Мне надо, полностью убить приложение при переходе его в фон (буду вызывать в этот момент Application.Terminate).

Подскажите, как узнать, что пользователь своими действиями (нажал кнопку назад, нажал кнопку возврата на главный экран…)  отправляет приложение в фон на телефоне?

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

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

  • 0
  • Модераторы

Для ознакомления следует прочитать статью про жизненный цикл андроид приложения

  • При нажатии кнопки назад на главной форме, приложение итак делает выход (не сворачивается)
  • При нажатии кнопки Home приложение сворачивается, смотрим события в статье

Но то что вы хотите сделать, это не правильно. Опишите задачу которая у вас стоит, возможно поможем её решить более гуманным способом

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

Большое спасибо, буду изучать.

Цитата

Но то что вы хотите сделать, это не правильно. Опишите задачу которая у вас стоит, возможно поможем её решить более гуманным способом

Программа служит исключительно для внутреннего использования в организации. Человек запускает программу на телефоне. Программа взаимодействует с устройством. Следующее взаимодействие возможно через 10 минут (таймер). Теперь человек решает - нужно ли ему это следящее взаимодействие или нет. Если нужно оставляет программу на переднем фоне. Если не нужно нажимает кнопку с Application.Terminate. Однако люди по привычке часто вместо нажатия кнопки в программе переходят на главный экран телефона, думая что программа прекратит работу и в результате получают через 10 минут не нужное взаимодействие с устройством.

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

а почему бы просто не останавливать таймер при событии Entered Background?

и если нужно запускать при Will Become Foreground

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

Верно, событие FormSaveState добавлено для сохранения состояния приложения и выполнения операций по остановке выполнения функций.

Т.е. в вашем случае, может быть, будет лучше просто остановить выполнение всех функций, а далее, после сворачивания система сама решит когда "прибить" ваше приложение.

Application.Terminate уже стабильно работает на Android? (последний раз проверял еще на XE6, там не работало)

На данный момент мне известно несколько (рабочих) вариантов закрытия:

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

Интересная тема. Вот почему то Close не работает стабильно. Приложение уходит в фон и после этого его можно почему-то запустить только со второго раза. А вот _exit(0); похоже работает как надо.

Все ли правильно тут, похоже, что работает, но надежно ли так? Спасибо.

public:		// User declarations
	  bool __fastcall HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext);

//***CPP***

#include <stdlib.h>
  
bool __fastcall TForm1::HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext)
{
	if (AAppEvent == TApplicationEvent::EnteredBackground)
	{
	 //Close(); после ухода в фон и попытки стартовать снова иногда надо две попытки
	 //Application->Terminate(); после ухода в фон и попытки стартовать снова иногда надо две попытки
	  _exit(0); //похоже работает как надо
	}
	return true;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

   _di_IFMXApplicationEventService Intf;
	if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXApplicationEventService)) )
	{
		Intf = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXApplicationEventService));
		Intf->SetApplicationEventHandler(HandleAppEvent);
	}
}

 

Ссылка на комментарий
  • 0
  • Модераторы
4 часа назад, Kitty сказал:

Интересная тема. Вот почему то Close не работает стабильно. Приложение уходит в фон и после этого его можно почему-то запустить только со второго раза. А вот _exit(0); похоже работает как надо.

Все ли правильно тут, похоже, что работает, но надежно ли так? Спасибо.


public:		// User declarations
	  bool __fastcall HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext);

//***CPP***

#include <stdlib.h>
  
bool __fastcall TForm1::HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext)
{
	if (AAppEvent == TApplicationEvent::EnteredBackground)
	{
	 //Close(); после ухода в фон и попытки стартовать снова иногда надо две попытки
	 //Application->Terminate(); после ухода в фон и попытки стартовать снова иногда надо две попытки
	  _exit(0); //похоже работает как надо
	}
	return true;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

   _di_IFMXApplicationEventService Intf;
	if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXApplicationEventService)) )
	{
		Intf = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXApplicationEventService));
		Intf->SetApplicationEventHandler(HandleAppEvent);
	}
}

 

попробуйте сделать через

MainActivity.finish;

 

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

Close у формы лишь закрывает форму. Если форма главная, то вызывается Application.Terminate.

Exit(0) по сути сразу же прерывает выполнение приложение в момент вызова. И означает выходи из потока. Поэтому приложение полностью выгружается.

Ссылка на комментарий
  • 0
bool __fastcall TForm1::HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext)
{
	if (AAppEvent == TApplicationEvent::EnteredBackground)
	{
	 MainActivity()->finish();
	}
	return true;
}

Эксперимент показал, что если приложение на переднем плане и если ничего не делать, а дождаться чтобы экран телефона сам погас и затем включить экран, то приложения на переднем плане уже нет. Значит затемнение экрана это тоже EnteredBackground. Правильно?

Ссылка на комментарий
  • 1
  • Модераторы
3 минуты назад, Kitty сказал:

bool __fastcall TForm1::HandleAppEvent(TApplicationEvent AAppEvent, TObject *AContext)
{
	if (AAppEvent == TApplicationEvent::EnteredBackground)
	{
	 MainActivity()->finish();
	}
	return true;
}

Эксперимент показал, что если приложение на переднем плане и если ничего не делать, а дождаться чтобы экран телефона сам погас и затем включить экран, то приложения на переднем плане уже нет. Значит затемнение экрана это тоже EnteredBackground. Правильно?

Да, прочитайте про жизненный цикл у Андрея в блоге. Там есть логи и показаны события

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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