Убить приложение после нажатия «Домой» (остановить его от простой паузы)

Всякий раз, когда нажимается кнопка «Домой», вызывается onPause, однако я установил onPause для обработки приостановки потока рисования при открытии диалогового окна. Это означает, что когда вы нажимаете кнопку «Домой», поток рисования приостанавливается и текущее действие остается открытым, однако я хочу закрыть действие/приложение. Как я могу остановить кнопку «Домой» от вызова onPause и заставить ее завершить действие?

РЕДАКТИРОВАТЬ: я только что понял, что приложение больше не видно, поэтому следует вызывать onStop(), однако это не так. Что может быть причиной этого?


person TomRichardson    schedule 26.06.2013    source источник
comment
Вы имеете в виду, что ваше приложение остается впереди, даже когда вы нажимаете кнопку «Домой»? Или это просто то, что он продолжает работать в бэкэнде? Это было бы нормальным поведением.   -  person Ridcully    schedule 26.06.2013
comment
@Ridcully - он не остается впереди, но вызывается onPause, а onStop никогда не вызывается. Я переопределил onPause для обработки при открытии диалогового окна и onResume для обработки при закрытии диалогового окна, однако, когда я ухожу с помощью кнопки «Домой», он никогда не возобновляется должным образом и вылетает.   -  person TomRichardson    schedule 26.06.2013
comment
Что это за диалог? Кто это показывает?   -  person ozbek    schedule 26.06.2013
comment
Диалог распознавания речи. Пользователь открывает его.   -  person TomRichardson    schedule 26.06.2013
comment
Не видя кода, кому-либо будет очень сложно объяснить, почему ваш код ведет себя так, а не иначе.   -  person CommonsWare    schedule 26.06.2013
comment
В Android нет концепции открытия или закрытия приложения. Вы должны говорить с точки зрения жизненного цикла деятельности.   -  person Jeffrey Blattman    schedule 15.09.2016


Ответы (4)


Переопределить onUserLeaveHint() и закончить/убить деятельность/процесс соответственно.

E.g.,

@Override
public void onUserLeaveHint() {
    finish();
    super.onUserLeaveHint();
}

ОБНОВЛЕНИЕ

Создайте локальную логическую переменную для отслеживания нажатия кнопки, которая показывает диалоговое окно. Установите значение true, как только пользователь нажмет кнопку; во всех остальных случаях (в onResume(), после начала рисования треда, после выхода из диалога и т. д.) оставьте его ложным. В onPause() поток рисования приостанавливается только в том случае, если эта переменная верна.

person ozbek    schedule 26.06.2013
comment
Я пробовал, однако, когда человек нажимает кнопку, чтобы открыть диалоговое окно распознавания речи, он закрывает приложение. - person TomRichardson; 26.06.2013
comment
Вы должны были указать это в вопросе :) - person ozbek; 26.06.2013
comment
Является ли этот диалог распознавания речи тем же диалогом, который вы упомянули в вопросе? - person ozbek; 26.06.2013
comment
Да, это. Пользователь нажимает кнопку, и диалоговое окно открывается над текущим действием. - person TomRichardson; 26.06.2013
comment
Создание переменной для отслеживания нажатия кнопки сработало. Я устанавливаю значение true, когда настроено намерение распознавания голоса, и устанавливаю значение false в OnActivityResult(). Спасибо! - person TomRichardson; 26.06.2013

На самом деле вы можете переопределить onPause() и вызвать finish() оттуда.

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

person Charlie-Blake    schedule 26.06.2013
comment
Как я уже упоминал, я переопределил onPause для обработки действия, приостанавливаемого при открытии диалогового окна, а onResume используется для повторного запуска перерисовки после закрытия диалогового окна. Я не могу вызвать завершение здесь, так как действие закончится, когда откроется диалоговое окно. - person TomRichardson; 26.06.2013

Он действительно вылетает? Затем вы должны опубликовать LogCat, показывающий сбой.

Возможно, вы не вызвали super.onPause() в переопределенном методе onPause()? Это обязательно, и если вы забудете об этом, приложение вылетит, явно сообщив вам в исключении, что вы не вызвали super.onPause().

person Ridcully    schedule 26.06.2013
comment
Я вызвал super.onPause(), а также, извините, он не падает, он зависает до тех пор, пока не будет принудительно закрыт сообщением «Не отвечает». - person TomRichardson; 26.06.2013

person    schedule
comment
Тип окна не может быть изменен после добавления ошибки окна при использовании этого кода. - person TomRichardson; 26.06.2013