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

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

В документах Android говорится:

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

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

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

  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. Захватите кнопку «Назад», затем запустите «Активность» на главном экране, эффективно помещая активность моего приложения в состояние «остановлено».

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

В большинстве случаев вам необходимо создать службу для выполнения чего-то в фоновом режиме, и ваша видимая 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 и эти рекомендации о том, как обращаться с кнопкой «Назад».

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

 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() определенный в classе android.app.Activity.

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

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

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

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

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

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

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

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

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

Override onBackPressed () после android 2.0. Такие как

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

Я использую @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); 

Спасибо.

  • Библиотека PDF для рендеринга файлов PDF в Android
  • java.lang.ClassCastException
  • Отправка запроса POST-запроса JSON с Android
  • Я не могу увидеть элементы FirebaseRecyclerAdapter на моем макете
  • Задача unmarshalling parcelables
  • Android - Activity Constructor vs onCreate
  • Различия в виджетах для Android
  • Android-разрешение не работает, даже если я его объявил
  • Proguard и размышления в Android
  • Пример прослушивателя в Интернете для Android
  • Разница между выражениями Return и Break
  • Interesting Posts

    Найти все элементы на странице, чей идентификатор элемента содержит определенный текст, используя jQuery

    Как заменить циклы с альтернативным функциональным программированием без оптимизации хвостового вызова?

    Элемент ViewData с ключом «MY KEY» имеет тип «System.String», но должен иметь тип «IEnumerable »,

    Установите скорость вращения вентилятора на RPM на Thinkpad T420s в Linux

    Как реализовать пространство из раздела Swap в ext4 «нормальный» раздел в Ubuntu?

    Как я могу безопасно переместить тома RAID 1 для Windows 7 на новый ПК?

    Как добавить элемент в ListBox в C # и WinForms?

    Плохие сектора на жестком диске

    Формат номера телефона и библиотека проверки

    Почему я не могу наследовать статические classы?

    Недостатки отсутствия раздела подкачки

    Должен ли я использовать char ** argv или char * argv в C?

    Алгоритм автоматической компоновки графики

    jquery nth child, который в настоящее время отображается

    Какой смысл смещения CD-дисков?

    Давайте будем гением компьютера.