Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка выхода из приложения, вывести подтверждение при выходе 
V
    Опции темы
gabin
Дата 30.7.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


студент



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 21.8.2008
Где: Харьков

Репутация: нет
Всего: нет



В программе по выбору из менюшки осуществляется выход из программы - вызывается функция finish() . 
Мне необходимо чтобы при выходе из приложения выводилось окно с запросом на выход . Написал код диалога в onCreateDialog:
Код

         case IDD_EXIT:
             AlertDialog.Builder builder = new AlertDialog.Builder(this);
             builder.setMessage("Are you sure you want to exit?");
             builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {        
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
                     // TODO Auto-generated method stub
                     EditorActivity.this.finish();
                 }
             });
             builder.setNegativeButton("No", new DialogInterface.OnClickListener() {        
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
                     // TODO Auto-generated method stub
                     dialog.cancel();
                 }
             });
             builder.setCancelable(false);
             return builder.create();

И перегрузил метод onDestroy() :
Код

    @Override
    public void onDestroy() {
     super.onDestroy();
     showDialog(IDD_EXIT);
    }

но при выходе никаких диалогов не появляется. Почему это происходит? Как это побороть?
PM MAIL WWW ICQ Skype   Вверх
spyswamp
Дата 30.7.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 4
Всего: 7



Я это сделал в перезагрузке onKeyDown() для Activity:

Код

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if (keyCode == KeyEvent.KEYCODE_BACK) 
        {
         // Диалог подтверждения завершения работы приложения.
            new AlertDialog.Builder(this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.exitdialog_title)
                .setMessage(R.string.exitdialog_message)
                .setPositiveButton(R.string.exitdialog_btn_yes,
                     new DialogInterface.OnClickListener()
                     {
                            public void onClick(DialogInterface dialog, int which) 
                            {
                                PurchaseList.this.finish();    
                            }
    
                     })
                .setNegativeButton(R.string.exitdialog_btn_no, null)
                .show();

            return true;
        }
        else 
        {
            return super.onKeyDown(keyCode, event);
        }
    }


Работает, как часы.

Добавлено через 2 минуты и 40 секунд
gabin, а в твоем случае, думаю, надо в onDestroy() выполнять showDialog(IDD_EXIT) до вызова метода базового класса. Но это всего лишь догадка, на практике не проверял, т.к. у меня пашет код, который выше. Сам глянешь - расскажешь. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
gabin
Дата 30.7.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


студент



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 21.8.2008
Где: Харьков

Репутация: нет
Всего: нет



Спасибо , как один из вариантов подходит. И в условный оператор ещё и желательно было бы добавить проверку KeyEvent.KEYCODE_HOME  так как приложение в таком случае тоже теряет фокус. 
Но не смотря на это есть одно большое НО : если я выхожу из приложения используя функцию finish() эти обработчики не вызываются. Странно, хоть в доках и пишут, что её вызов приводит к вызову метода onDestroy() текущей Activity ..
И даже поменяв местами метод суперкласса и вызов диалога:
Код

@Override
    public void onDestroy() {
     showDialog(IDD_EXIT);
     super.onDestroy();
    }

требуемые диалоги не вызываются ....
PM MAIL WWW ICQ Skype   Вверх
spyswamp
Дата 31.7.2011, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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, имхо. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
gabin
Дата 31.7.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


студент



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 21.8.2008
Где: Харьков

Репутация: нет
Всего: нет



Ок, тогда в качестве функции выхода мне не вызывать finish(), а эмулировать нажатие кнопки Back ? Так получается?
Логи говорят, что скорее всего до вызова onDestroy не доходит. 
Код

07-31 16:03:06.949: INFO/ActivityManager(58): Displayed activity com.samples.preferences/.EditorActivity: 3992 ms (total 3992 ms)
07-31 16:03:12.230: DEBUG/dalvikvm(1129): GC_EXPLICIT freed 84 objects / 7656 bytes in 141ms
07-31 16:03:17.240: DEBUG/dalvikvm(1144): GC_EXPLICIT freed 46 objects / 2224 bytes in 150ms
07-31 16:03:22.270: DEBUG/dalvikvm(233): GC_EXPLICIT freed 101 objects / 6376 bytes in 180ms
07-31 16:03:27.399: DEBUG/dalvikvm(131): GC_EXPLICIT freed 1454 objects / 88952 bytes in 320ms
07-31 16:03:37.869: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol
07-31 16:03:44.110: WARN/KeyCharacterMap(25187): No keyboard for id 0
07-31 16:03:44.110: WARN/KeyCharacterMap(25187): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
07-31 16:03:46.240: INFO/EventLogService(190): Aggregate from 1312115626054 (log), 1312115626054 (data)
07-31 16:03:47.190: INFO/ActivityManager(58): Starting activity: Intent { cmp=com.samples.preferences/.OpenFileActivity }
07-31 16:03:48.979: INFO/ActivityManager(58): Displayed activity com.samples.preferences/.OpenFileActivity: 1496 ms (total 1496 ms)
07-31 16:03:54.220: DEBUG/dalvikvm(190): GC_EXPLICIT freed 812 objects / 135736 bytes in 182ms
07-31 16:03:54.519: INFO/global(25187): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
07-31 16:03:54.789: INFO/global(25187): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
07-31 16:04:05.979: WARN/IInputConnectionWrapper(25187): showStatusIcon on inactive InputConnection

 при таком раскладе:
Код

    @Override
    public void onDestroy() {
     try {
     Toast.makeText(this, "Bye", Toast.LENGTH_SHORT);
     } catch (Exception e) {
          for(StackTraceElement stackTraceElement : e.getStackTrace())
                 Log.e("StackTrace", stackTraceElement.toString());
     }
     super.onDestroy();
    }

Logcat молчит и при выходе выдаёт лишь Warning showStatusIcon on inactive InputConnection
P.S Вообще изначально у меня стояла задача сохранить настройки в Preferences при выходе из приложения. Только вот то, что управление не передаётся ни в onDestroy ни в onStop вводит меня в ступор
PM MAIL WWW ICQ Skype   Вверх
spyswamp
Дата 31.7.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 4
Всего: 7



gabin, есть подозрение, что до onDestroy() не доходит по той причине, что процесс все еще активен. Если глянуть на Activity Lifecycle, то могу предположить, что сначала стоит проверить доходит ли до onPause() и onStop(). Перезагрузи эти функции и посмотри что к чему.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
spyswamp
Дата 31.7.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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'
PM MAIL   Вверх
gabin
Дата 1.8.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


студент



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 21.8.2008
Где: Харьков

Репутация: нет
Всего: нет



Начал перегружать все функции из Activity Lifecycle - это беда . Хотел записывать в RandomAccessFile строки , что мол побывал в соответствующей функции, но выкидывает NullPointerException'ы - я так понимаю прога почему-то не получает доступ к глобальному файловому объекту - будто его и нет вовсе. 
Код написанный в onStop и в onDestroy - не выполняется, где бы он не стоял - после или перед вызовом конструктора суперкласса :( . Такое чувство что жизненный цикл Activity через жопу проектировали и через жопу реализовывали.

P. S. Вообщем отказался я от затеи выходить через finish() , убрал вовсе этот пункт из меню. Настройки при выходе буду сохранять через обработчик нажатия клавиш Back и Home
PM MAIL WWW ICQ Skype   Вверх
binarytoys
Дата 4.9.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.4.2011

Репутация: нет
Всего: нет



Цитата(gabin @  1.8.2011,  20:16 Найти цитируемый пост)
Настройки при выходе буду сохранять через обработчик нажатия клавиш Back и Home


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

Вобще это в корне неверный паттерн. onDestroy вызывается при уничтожении активити, а это происходит только тогда, когда Андроид решает очистить память, занятую активити. При этом активити может уже давно скрыто от пользователя, но все равно находится в памяти.

Поэтому общепринятая практика - сохранять установки при их изменении или при вызове onPause
PM MAIL   Вверх
PiyodaiSiyo
Дата 5.9.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



добавь в активити клас 

    
Код

@Override
protected Dialog onCreateDialog(int id) {
        if(id==0)
        return alert;
        else return null;
        
    }

ну или как там диалог называется и вызови финиш из диалога

Добавлено через 1 минуту и 59 секунд
да еще надо в диалоге 
Код

showDialog(0);

PM MAIL   Вверх
ivanovpv
Дата 6.9.2011, 08:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 9
Всего: 28



2 небольшие ремарки:
1) Клавиша HOME не перехватывается - никак. Это сделано специально, чтобы у юзера всегда была возможность выйти на хоум скрин несмотря на любую кривизну любых приложений. 
2) Вызов finish() останавливает Активити, но не гарантирует, что приложение будет остановлено. Внутренний диспетчер оси сам решает, когда приложение будет завершено. Для того чтобы точно убить нужно вызвать:

Код

Process.killProcess(Process.myPid());



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
toxx
Дата 6.9.2011, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



PiyodaiSiyo
что за ужасный псевдокод? Если учите делать, то учите сразу делать правильно.
1.Нужно в onCreateDialog добавить switch по id
2.Если ваши манипуляции не прошли,  нужно вызывать super.OnCreateDialog
PM MAIL   Вверх
PiyodaiSiyo
Дата 7.9.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



Тело super
onCreateDialog
{
throw new RuntimeException ("Stub!");
}
PM MAIL   Вверх
toxx
Дата 7.9.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



И что с того?Там не так + так никто не пишет
PM MAIL   Вверх
PiyodaiSiyo
Дата 7.9.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



да декомпилер так пишет про библиотечный активити класс. Очень страно...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.