![]() |
|
Модераторы: javastic |
![]()
|
|
| gabin |
|
||||
|
студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
В программе по выбору из менюшки осуществляется выход из программы - вызывается функция finish() .
Мне необходимо чтобы при выходе из приложения выводилось окно с запросом на выход . Написал код диалога в onCreateDialog:
И перегрузил метод onDestroy() :
но при выходе никаких диалогов не появляется. Почему это происходит? Как это побороть? |
||||
|
|||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 4 Всего: 7 |
Я это сделал в перезагрузке onKeyDown() для Activity:
Работает, как часы. Добавлено через 2 минуты и 40 секунд gabin, а в твоем случае, думаю, надо в onDestroy() выполнять showDialog(IDD_EXIT) до вызова метода базового класса. Но это всего лишь догадка, на практике не проверял, т.к. у меня пашет код, который выше. Сам глянешь - расскажешь. -------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| gabin |
|
|||
|
студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Спасибо , как один из вариантов подходит. И в условный оператор ещё и желательно было бы добавить проверку KeyEvent.KEYCODE_HOME так как приложение в таком случае тоже теряет фокус.
Но не смотря на это есть одно большое НО : если я выхожу из приложения используя функцию finish() эти обработчики не вызываются. Странно, хоть в доках и пишут, что её вызов приводит к вызову метода onDestroy() текущей Activity .. И даже поменяв местами метод суперкласса и вызов диалога:
требуемые диалоги не вызываются .... |
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 4 Всего: 7 |
gabin, угум, за KEYCODE_HOME спасибо, допишу потом. А что у тебя в дебаггере-то творится? Заходит вообще в onDestroy()?
Добавлено через 6 минут и 28 секунд Ваще знаешь, что я подумал. Даже если ты из onDestroy() будешь вызывать диалог, то смысла в нем не будет. Во-первых, он не "модальный", т.е. после его вызова onDestroy() отработает и завершится. Что будет в этом случае - я хз, но, по-логике, ерунда. А вот только потом, когда ты вызовешь из AlertDialog'а finish(), то опять что ли должен вызываться onDestroy()? Во-вторых, когда вызывается onDestroy() - это значит, что Activity уже умирает. Но ты каким-то магическим способом думаешь, что если закрыть AlertDialog по cancel-кнопке, то Activity не закроется? Из твоего кода я этого не улавливаю. Сам посуди. Либо я не до конца догоняю твою логику, либо покажи мне Time UML-диаграмму, чтобы я врубился в циклы жизни Activity и все вызовы onDestroy(), которых вообще должно быть 1, имхо. -------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| gabin |
|
||||
|
студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Ок, тогда в качестве функции выхода мне не вызывать finish(), а эмулировать нажатие кнопки Back ? Так получается?
Логи говорят, что скорее всего до вызова onDestroy не доходит.
при таком раскладе:
Logcat молчит и при выходе выдаёт лишь Warning showStatusIcon on inactive InputConnection P.S Вообще изначально у меня стояла задача сохранить настройки в Preferences при выходе из приложения. Только вот то, что управление не передаётся ни в onDestroy ни в onStop вводит меня в ступор |
||||
|
|||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 4 Всего: 7 |
gabin, есть подозрение, что до onDestroy() не доходит по той причине, что процесс все еще активен. Если глянуть на Activity Lifecycle, то могу предположить, что сначала стоит проверить доходит ли до onPause() и onStop(). Перезагрузи эти функции и посмотри что к чему.
-------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 4 Всего: 7 |
Забыл добавить: после события onPause() актвити ты, по идее, видеть уже не должен. Т.е. производить всякие GUI-махинации после этого уже смысла не имеет, ни в onStop(), ни в onDestroy(). На блок-схеме жезненного цикла это видно: http://developer.android.com/reference/and...p/Activity.html
-------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| gabin |
|
|||
|
студент Профиль Группа: Участник Сообщений: 28 Регистрация: 21.8.2008 Где: Харьков Репутация: нет Всего: нет |
Начал перегружать все функции из Activity Lifecycle - это беда . Хотел записывать в RandomAccessFile строки , что мол побывал в соответствующей функции, но выкидывает NullPointerException'ы - я так понимаю прога почему-то не получает доступ к глобальному файловому объекту - будто его и нет вовсе.
Код написанный в onStop и в onDestroy - не выполняется, где бы он не стоял - после или перед вызовом конструктора суперкласса :( . Такое чувство что жизненный цикл Activity через жопу проектировали и через жопу реализовывали. P. S. Вообщем отказался я от затеи выходить через finish() , убрал вовсе этот пункт из меню. Настройки при выходе буду сохранять через обработчик нажатия клавиш Back и Home |
|||
|
||||
| binarytoys |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.4.2011 Репутация: нет Всего: нет |
Тогда настройки не будут сохраняться в случае вызова приложений из статусбара или прерывания активити телефонным вызовом, алармом и т.д. Вобще это в корне неверный паттерн. onDestroy вызывается при уничтожении активити, а это происходит только тогда, когда Андроид решает очистить память, занятую активити. При этом активити может уже давно скрыто от пользователя, но все равно находится в памяти. Поэтому общепринятая практика - сохранять установки при их изменении или при вызове onPause |
|||
|
||||
| PiyodaiSiyo |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 31.12.2009 Репутация: 1 Всего: 2 |
добавь в активити клас
ну или как там диалог называется и вызови финиш из диалога Добавлено через 1 минуту и 59 секунд да еще надо в диалоге
|
||||
|
|||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 9 Всего: 28 |
2 небольшие ремарки:
1) Клавиша HOME не перехватывается - никак. Это сделано специально, чтобы у юзера всегда была возможность выйти на хоум скрин несмотря на любую кривизну любых приложений. 2) Вызов finish() останавливает Активити, но не гарантирует, что приложение будет остановлено. Внутренний диспетчер оси сам решает, когда приложение будет завершено. Для того чтобы точно убить нужно вызвать:
-------------------- Aut viam inveniam aut faciam |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: нет Всего: 13 |
PiyodaiSiyo
что за ужасный псевдокод? Если учите делать, то учите сразу делать правильно. 1.Нужно в onCreateDialog добавить switch по id 2.Если ваши манипуляции не прошли, нужно вызывать super.OnCreateDialog |
|||
|
||||
| PiyodaiSiyo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 31.12.2009 Репутация: 1 Всего: 2 |
Тело super
onCreateDialog { throw new RuntimeException ("Stub!"); } |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: нет Всего: 13 |
И что с того?Там не так + так никто не пишет
|
|||
|
||||
| PiyodaiSiyo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 31.12.2009 Репутация: 1 Всего: 2 |
да декомпилер так пишет про библиотечный активити класс. Очень страно...
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Android | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |