Как убить действие при нажатии кнопки «Назад»?

У меня есть действие, которое при запуске загружает изображение из Интернета. В целях экономии памяти, когда действие оставлено нажатием кнопки «Назад», я хочу, чтобы действие сбрасывало все данные, то есть избавлялось от всех строк и изображений, которые в нем есть. Я решил, что лучший способ сделать это — просто убить активность.

Ну, я не могу понять обратный вызов при нажатии кнопки «Назад». Итак, я пытался использовать обратные вызовы onPause() и onStop() для задачи, но оба способа принудительно закрывают мое приложение. Вот код:

public void onPause() {
    this.finish();
}
public void onStop() {
    finish();
}

Я пробовал несколько вариантов этого, но ни один из них не работал. Есть идеи?


person Shaun    schedule 24.01.2011    source источник
comment
что именно вы ищете?чтобы завершить текущую деятельность на ?кнопке назад   -  person chikka.anddev    schedule 24.01.2011


Ответы (5)


добавьте это в свою деятельность

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK))
    {
        finish();
    }
    return super.onKeyDown(keyCode, event);
}
person ingsaurabh    schedule 24.01.2011
comment
В чем смысл? Нажатие кнопки «Назад» автоматически спустится вниз по стеку активности. finish() просто гарантирует, что вы не сможете вернуться. (Тем не менее, вопрос, по общему признанию, расплывчатый.) - person EboMike; 24.01.2011
comment
конечно, но активность не определена при нажатии кнопки «Назад», поэтому завершение уничтожения важно, и это то, о чем задавался вопрос, но поскольку освобождение памяти происходит, ОС делает это автоматически. - person ingsaurabh; 24.01.2011
comment
Точно нет. Если активности нет впереди, она может быть восстановлена ​​ОС. Закончили или нет. - person EboMike; 24.01.2011
comment
Кроме того, я часто вижу этот хак с KEYCODE_BACK. Что, если пользователь нажмет кнопку HOME? Что, если пользователь будет удерживать кнопку ДОМОЙ, чтобы выбрать другое приложение? Что, если приложение переключилось из-за телефонного звонка? ИЛИ уведомление? В большинстве случаев, если вы проверяете KEYCODE_BACK, вы делаете это неправильно. - person EboMike; 24.01.2011
comment
Не знаю, что вы говорите, но его не обязательно исправлять, поэтому для правильной утилизации используется этот хак, и то, что вы говорите, не задается вопросом, я только ответил на то, что спрашивают, и это то, как большинство приложений для Android используете любой другой способ, пожалуйста, предложите - person ingsaurabh; 24.01.2011
comment
Я понимаю, откуда все исходят, но это ответ, который я искал. Если бы они хотели вернуться к активности, я бы хотел, чтобы они все равно перезагрузили ее, поскольку информация могла быть изменена на сервере. Спасибо за вашу помощь в этом. - person Shaun; 26.01.2011
comment
я смотрел на это, и кажется, что я позвоню, но память не освобождается. ТАК, если я начну действие, затем остановлю его, а затем запущу снова, я получу OutOfMemoryError.. Конечно, то, что я сделал, было завершено в onStop вместо этой настройки. Позвольте мне попробовать этот путь. Обновление: это все еще не работает. - person Fallenreaper; 16.10.2012
comment
Ответ EboMike ниже является правильным ответом. Завершение действия НЕ обязательно освобождает память. - person A.J.; 16.12.2014

Простое переопределение метода onBackPressed:

    @Override
    public void onBackPressed() {
            super.onBackPressed();
            this.finish();
    }
person Dhiral Pandya    schedule 29.02.2012

public boolean onKeyDown(int keycode, KeyEvent event) {
    if (keycode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
    }
    return super.onKeyDown(keycode, event);
}

Мое приложение закрыто с приведенным выше кодом.

person PhuongNguyen    schedule 08.05.2012
comment
Его работа, но приложение всегда открыто на той же странице, когда приложение не убито. - person Keshav Gera; 11.08.2017
comment
но хотите запустить приложение в лаунчере - person Keshav Gera; 11.08.2017

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

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

Пожалуйста, см. здесь отличную статью по этой теме.

person EboMike    schedule 24.01.2011
comment
Если действие использует много ресурсов, то почему бы не убить его изнутри вашего приложения, а не ждать сборщика мусора? Это совершенно другой процесс, который нужно будет выполнить, что замедлит работу телефона. Хорошее управление памятью делает все возможное, чтобы управлять ею внутри самой программы. Вот почему большинство управляемых языков программирования и IDE автоматически добавляют в программу код самоочистки, а также причина, по которой вы даете жизненный цикл, чтобы вы могли управлять памятью наилучшим образом из своего приложения. - person Shaun; 26.01.2011
comment
Шон прав, хорошее управление памятью делает все возможное, чтобы управлять ею внутри самой программы. - person dns; 18.08.2013

Что ж, если вы изучаете структуру жизненного цикла приложения, здесь , то вы узнаете, что onPause() вызывается, когда другая активность получает фокус, а onStop() вызывается, когда активность больше не видна.

Из того, что я уже узнал, вы можете вызывать finish() только из активности, которая активна и/или имеет фокус. Если вы вызываете finish() из метода onPause(), это означает, что вы вызываете его, когда активность больше не активна. поэтому выбрасывается исключение.

Когда вы звоните finish() из onStop(), тогда активность отправляется в фоновый режим, поэтому больше не будет видна, а затем это исключение.

При нажатии кнопки back вызывается onStop().

Скорее всего, Android автоматически сделает за вас то, что вы сейчас хотите сделать.

person Aman Alam    schedule 24.01.2011