Переопределить кнопку назад, чтобы действовать как кнопка Домой


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

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

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

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

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

  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 235

9 ответов:

большую часть времени вам нужно создать сервис выполнить что-то в фоновом режиме, и ваш видимый Activity просто контролирует этот Service. (Я уверен, что музыкальный плеер работает таким же образом, поэтому пример в документах кажется немного вводящим в заблуждение.) Если это так, то ваш Activity can 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 метод, и эти рекомендации о том, как обращаться со спиной кнопка.

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

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

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

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

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

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

попробуйте переопределить void onBackPressed() определяется в android.приложение.Класс активности.

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

}

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

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

убедитесь, что не называю супер.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); in onBackPressed и обязательно удалить super.onBackPressed

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

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

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

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

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

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

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

Я использую @ Mirko N. answser, используя новый пользовательский 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);

спасибо.