Кнопка "Отменить назад", чтобы действовать как кнопка "домой"

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

В Android docs говорится:

... не все действия имеют поведение, которое они уничтожаются при нажатии BACK. Когда пользователь начинает воспроизводить музыку в приложении "Музыка", а затем нажимает "BACK", приложение отменяет нормальное обратное поведение, предотвращая уничтожение активности игрока и продолжает воспроизводить музыку, даже если его активность больше не видна.

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

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

  • Захват кнопки "Назад" нажмите (как показано ниже), а затем вызовите любой метод (ы), который вызывает домашние кнопки.

    @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);
    }
    
  • Нажмите кнопку "Назад" , а затем нажмите кнопку "Домашний".

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

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

Ответ 1

В большинстве случаев вам нужно создать Service, чтобы выполнить что-то в фоновом режиме, и ваш видимый 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);
}

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

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

Ответ 2

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

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

Ответ 3

Если вы хотите поймать кнопку "Назад", посмотрите В документации говорится о следующих услугах:

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

Это кажется подходящим для ваших требований.

Ответ 4

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

Ответ 5

если это помогает кому-то другому, у меня была активность с двумя макетами, которые я переключил на просмотр и просмотр для визуализации, пытаясь имитировать некую структуру 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
    }

}

надеюсь, что это поможет кому-то, приветствия

Ответ 6

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

Убедитесь, что вы не вызываете 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

Ответ 7

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

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

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

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

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

Ответ 8

Переопределить onBackPressed() после android 2.0. Например,

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Ответ 9

У меня есть использование @Mirko N. answser, сделав новый Custom 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);

Спасибо.