Предупреждение при выходе из приложения Android

Снимок

Часто бывает, что нужно перед выходом пользователя из программы спросить его о чем-нибудь.
Например, сохранить «всё, что нажито не посильным трудом» или просто сказать: «не уходи дорогой товарищ, нам будет тебя не хватать».
В родной нашей Delphi достаточно на событие главной формы onClose повесить свой обработчик.
А как сделать такой же трюк в Андроид?

Нужно для ясности обратиться к теории, советую изучить жизненный цикл приложения.
Система Андроид была спроектирована для наибольшей энергоэффективности, поэтому то, что уже загружалось в оперативную память, будет из неё удалено не сразу, а как только понадобятся ресурсы.
Рабочее приложение может быть в двух состояниях, работающее на главном экране и находящееся в оперативной памяти, пока система сама его не выгрузит.
Когда приложение уходит с главного экрана у него происходит событие OnStop, когда система его убивает OnDestroy.
Чтобы убрать приложение с главного экрана, можно просто нажать клавишу Home, при возврате к приложению оно восстановит своё состояние (если написано оно прямыми руками). Обычно пользователь закрывает программу, нажимая клавишу Back. Этот момент нужно отловить и спросить, а действительно ли он хочет уйти?
Если приложение простое и не содержит фрагментов, то процедура будет простая:

[cce lang=»java» tab_size=»2″ no_links=»false»]

public void onBackPressed() {
new AlertDialog.Builder(this)
.setMessage(«Вы действительно хотите покинуть программу?»)
.setCancelable(false)
.setPositiveButton(«Да», new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
}).setNegativeButton(«Нет», null).show();
};

[/cce]

Создаем новый AlertDialog и задаем вопрос, ели ответили Да , то вызываем finish(), если Нет, то ничего не делаем.

А вот если у нас более сложное приложение с фрагментами, где клавиша Назад используется для навигации, нам необходимо следить за фрагментами с помощью FragmentManager и если их не осталось (т.е. стал fm.getBackStackEntryCount() <= 1), задавать вопрос.

[cce lang=»java» tab_size=»2″ no_links=»false»]

@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 1) {
fm.popBackStackImmediate();
} else {
new AlertDialog.Builder(this)
.setMessage(«Вы действительно хотите покинуть программу?»)
.setCancelable(false)
.setPositiveButton(«Да»,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
finish();
}
}).setNegativeButton(«Нет», null).show();
}
}

[/cce]

 

Нашли ошибку в тексте?

Предупреждение при выходе из приложения Android: 3 комментария

  1. irnis

    вообще-то в обычных дельфях не на onClose, а на onCloseQuery…

  2. Уведомление: Красивый таймер для Android | rusdelphi.com

  3. Уведомление: Новости из мира Delphi 15.09 – 21.09 2014 | Delphi 2010 ru

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *