Перейти к содержанию
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 пользователей онлайн

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