Часто бывает, что нужно перед выходом пользователя из программы спросить его о чем-нибудь.
Например, сохранить “всё, что нажито не посильным трудом” или просто сказать: “не уходи дорогой товарищ, нам будет тебя не хватать”.
В родной нашей 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]
вообще-то в обычных дельфях не на onClose, а на onCloseQuery…
Уведомление: Красивый таймер для Android | rusdelphi.com
Уведомление: Новости из мира Delphi 15.09 – 21.09 2014 | Delphi 2010 ru