Android: как определить, выйдет ли кнопка «Назад» из приложения (т.е. это последнее действие, оставшееся в стеке)?

Я хотел бы предупредить пользователя, если обратное нажатие завершит последнее действие в стеке, тем самым выйдя из приложения. Я хотел бы открыть небольшой тост и обнаружить второе обратное нажатие в течение следующих нескольких секунд и только затем позвонить finish().

Я уже закодировал обнаружение обратного нажатия с помощью onBackPressed(), но я не могу найти очевидного способа увидеть, сколько действий осталось в обратном стеке.

Спасибо.


person Artem Russakovskii    schedule 27.09.2011    source источник


Ответы (2)


Reddit - это забавное приложение, которое делает это путем переопределения метода onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK && isTaskRoot()) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.quit)
        .setMessage(R.string.really_quit)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                //Stop the activity
                finish();    
            }
        })
        .setNegativeButton(R.string.no, null)
        .show();

        return true;
    }
    else {
        return super.onKeyDown(keyCode, event);
    }
}
person Darren Kopp    schedule 27.09.2011
comment
isTaskRoot () кажется самым чистым методом, не требующим дополнительных разрешений. Думаю, это победитель. - person Artem Russakovskii; 27.09.2011
comment
Что здесь mSettings? - person berserk; 16.06.2014
comment
@berserk mSettings - это просто ссылка на настройки приложения, определяющие, хотим ли мы отображать диалоговое окно подтверждения или нет. в данном примере это не критично. - person Darren Kopp; 16.06.2014
comment
Он не определяет, является ли это последним действием. Он возвращает false. У меня в стеке оставалось только одно действие. - person berserk; 17.06.2014
comment
isTaskRoot () возвращает true, даже если возврат не приводит к выходу из приложения. т.е. ..., если вы показываете кучу фрагментов - person Jia Tse; 07.03.2016

Библиотека droid-fu делает это, проверяя стек запущенных задач и проверяя, является ли следующая задача домашний экран Android. См. handleApplicationClosing на странице https://github.com/kaeppler/droid-fu/blob/master/src/main/java/com/github/droidfu/activities/BetterActivityHelper.java.

Однако я бы использовал этот подход только в крайнем случае, поскольку он довольно хакерский, не будет работать во всех ситуациях и требует дополнительных разрешений для получения списка запущенных задач.

person Russell Davis    schedule 27.09.2011
comment
Понятия не имею, почему они решили проверить наличие явной пусковой установки Android, а не их собственный пакет, но это поставило меня на правильный путь. - person Artem Russakovskii; 27.09.2011