Переопределить кнопку «Назад», чтобы действовать как кнопка «Домой» - PullRequest
242 голосов
/ 04 января 2010

После нажатия кнопки "Назад" я бы хотел, чтобы мое приложение перешло в состояние останова, а не в уничтоженное состояние.

В Android документы он гласит:

... не все действия ведут себя так, как будто они разрушаются при нажатии НАЗАД. Когда пользователь начинает воспроизведение музыки в приложении «Музыка», а затем нажимает кнопку «НАЗАД», приложение отменяет нормальное поведение спины, предотвращая разрушение активности проигрывателя, и продолжает воспроизведение музыки, даже если его активность больше не отображается

Как мне воспроизвести эту функцию в моем собственном приложении?

Я думаю, что должно быть три варианта ...

  1. Захватите кнопку «назад» (как показано ниже) и затем вызовите любой метод, который вызывает кнопка «Домой».

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
    
  2. Захватить кнопку «Назад» и затем подделать нажатие кнопки «Домой».

  3. Захватите кнопку «Назад», затем запустите «Активность» на главном экране, фактически переведя «Активность» моего приложения в состояние остановки.

Edit: Я знаю об услугах и использую один в приложении, с которым связана эта проблема. Этот вопрос, в частности, касается перевода Действия в состояние остановки, а не в состояние уничтожения при нажатии кнопки «Назад».

Ответы [ 9 ]

331 голосов
/ 04 января 2010

Большую часть времени вам нужно создать Сервис для выполнения чего-либо в фоновом режиме, и ваш видимый Activity просто контролирует это Service. (Я уверен, что музыкальный проигрыватель работает таким же образом, поэтому пример в документации кажется немного вводящим в заблуждение.) Если это так, то ваш Activity может finish как обычно, а Service все равно будет работает.

Более простой подход - захватить нажатие кнопки Back и вызвать moveTaskToBack (true) следующим образом:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Я думаю, что предпочтительным вариантом должна быть активность, чтобы она нормально заканчивалась и могла воссоздать себя, например. чтение текущего состояния из службы, если это необходимо. Но moveTaskToBack может иногда использоваться как быстрая альтернатива.

ПРИМЕЧАНИЕ : как указал Дэйв ниже, в Android 2.0 появился новый метод onBackPressed, и эти рекомендации о том, как обрабатывать кнопку Назад.

44 голосов
/ 27 апреля 2012

Используйте следующий код:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}
22 голосов
/ 04 января 2010

Если вы хотите поймать кнопку «Назад», посмотрите на этот пост в блоге разработчиков Android . В нем описывается более простой способ сделать это в Android 2.0 и лучший способ сделать это для приложения, работающего в 1.x и 2.0.

Однако, если ваша активность остановлена, она все равно может быть уничтожена в зависимости от наличия памяти на устройстве. Если вы хотите, чтобы процесс запускался без пользовательского интерфейса, вы должны создать Service. В документации говорится об услугах:

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

Кажется, они соответствуют вашим требованиям.

17 голосов
/ 03 июня 2011

попытаться переопределить void onBackPressed(), определенный в android.app.Activity.

13 голосов
/ 07 декабря 2011

, если это кому-то помогает, у меня было действие с двумя макетами, которые я включал и выключал для наглядности, пытаясь эмулировать некую структуру page1> page2. если бы они были на странице 2 и нажали кнопку «назад», я бы хотел, чтобы они вернулись на страницу 1, если они нажали кнопку «назад» на странице 1, она все равно должна работать как обычно. Это довольно простой, но он работает

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

надеюсь, это кому-нибудь поможет, веселит

9 голосов
/ 20 мая 2014

Рабочий пример ..

Убедитесь, что не вызываете super.onBackPressed ();

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

Таким образом, кнопка «Назад» действует как кнопка «Домой». Это не заканчивает твою деятельность, но берет это к фону

Второй способ - позвонить moveTaskToBack(true); в onBackPressed и обязательно удалить super.onBackPressed

0 голосов
/ 25 июня 2016

Переопределить onBackPressed () после Android 2.0. Такие как

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
0 голосов
/ 18 декабря 2012

Еще лучше, как насчет OnPause () :

Вызывается как часть жизненного цикла действия, когда действие уходит в фон, но еще не было (пока) убито. Аналог onResume ().

Когда действие B запускается перед действием A, этот обратный вызов будет вызываться для A. B не будет создаваться до тех пор, пока не вернется функция onPause (), поэтому убедитесь, что enter code here не выполняет здесь никаких действий.

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

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

0 голосов
/ 22 февраля 2012

Я использую автоответчик @Mirko N., используя новый пользовательский EditText

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

Затем установите данные из вашей деятельности

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

Спасибо.

...