Переопределить кнопку назад, чтобы действовать как кнопка Домой
при нажатии кнопки "назад" я бы хотел, чтобы мое приложение перешло в остановленное состояние, а не в разрушенное состояние.
в Android docs говорится:
...не все действия имеют поведение, которое они разрушаются при нажатии назад. Когда пользователь начинает воспроизводить музыку в музыкальном приложении, а затем нажимает назад, приложение переопределяет нормальное поведение назад, предотвращая разрушение активности проигрывателя, и продолжает играть музыку, хотя ее активность больше не видна
как повторить эту функциональность в моем приложении?
Я думаю, что должно быть три возможности...
-
захват кнопки "Назад" нажмите (как показано ниже), а затем вызовите любой метод(Ы), который вызывает кнопка "Домой".
@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: Я знаю о сервисах и использую один в приложении, с которым связана эта проблема. Этот вопрос конкретно касается перевода активности в остановленное состояние, а не в разрушенное состояние при нажатии кнопки "Назад".
9 ответов:
большую часть времени вам нужно создать сервис выполнить что-то в фоновом режиме, и ваш видимый
Activity
просто контролирует этотService
. (Я уверен, что музыкальный плеер работает таким же образом, поэтому пример в документах кажется немного вводящим в заблуждение.) Если это так, то вашActivity
canfinish
как обычно и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
. в документации говорится следующее Услуги:сервис не имеет визуального интерфейса, а работает в фоновом режиме на неопределенный срок. Например, служба может воспроизводить фоновую музыку, когда пользователь занимается другими вопросами, или она может получать данные по сети или вычислять что-то и предоставлять результат для действий, которые в нем нуждаются.
Это кажется подходящим для ваших требований.
если это помогает кому-то еще, у меня была активность с 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);
inonBackPressed
и обязательно удалить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);
спасибо.