Android: вернуться к предыдущей активности


525

Я хочу сделать что-то простое на Android-приложение. Как можно вернуться к предыдущему занятию?

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


5
Следите за последними открытыми активами
— Vuk

54
Вы просто вызываете финиш (); Приветствия
— Нгуен Минь Бинь

super.finish (); если вы звоните изнутри деятельности!
— happyhardik

5
Один вопрос здесь: если Android уничтожил предыдущее действие из-за меньшего количества памяти или других проблем, то этого действия больше не было бы в backstack, и что тогда происходит?
— Солнечное

@ Солнечно Я предполагаю, что сборщик мусора начинается с самого верхнего действия в стеке. Таким образом, если нет предыдущей активности, то также не будет текущей активности. Но я просто предполагаю, что, поскольку такое поведение будет более целесообразным, чем освобождение памяти в стеке без какого-либо определенного порядка. Исправьте мой комментарий, если кто-то точно это знает.
— Седат

Ответы:


486

Действия Android хранятся в стеке действий. Возвращение к предыдущему занятию может означать две вещи.

  1. Вы открыли новое действие из другого действия с помощью startActivityForResult . В этом случае вы можете просто вызвать функцию finishActivity () из своего кода, и она вернет вас к предыдущему действию.

  2. Следите за стеком активности. Всякий раз, когда вы начинаете новое действие с намерением, вы можете указать флаг намерения, например FLAG_ACTIVITY_REORDER_TO_FRONTили FLAG_ACTIVITY_PREVIOUS_IS_TOP. Вы можете использовать это для перемещения между действиями в вашем приложении. Я не использовал их много, хотя. Посмотрите на флаги здесь: http://developer.android.com/reference/android/content/Intent.html

Как упомянуто в комментариях, если действие открывается, startActivity()то можно закрыть его finish(). Если вы хотите использовать кнопку «Вверх», вы можете поймать это в onOptionsSelected(MenuItem item)методе, сравнив идентификатор элемента в android.R.id.homeотличие от R.id.homeупомянутого в комментариях.


237
Или, если вы открыли действие с помощью startActivity (), вы можете закрыть с помощью finish () (не нужно передавать никаких параметров)
— neworld,

3
Можете ли вы уточнить, где и как вы используете метод finish (), поэтому, когда пользователь нажимает кнопку «вверх», он переносит его к предыдущему действию
— RicNjesh,

4
@RicNjesh В вашем методе onOptionsItemSelected, если щелкнувший элемент меню имеет идентификатор R.id.home, вызовите finish (). Он закроет текущую активность и вернет вас к деятельности, которая запустила его с помощью startActivity ()
— Anders Ullnæss

Я заставляю пользователя выполнять многие действия один за другим через намерения. Нужно ли что-то делать, чтобы приложение не зависало при слишком большом количестве операций в стеке? Спасибо!
— Ручир Барония

1
Вы уверены, что упражнение 1 не умрет в какой-то момент до того, как вы закончите упражнение 2?
— user924

225

Попробуй Activity#finish(). Это более или менее то, что кнопка «Назад» делает по умолчанию.


1
Почему #? или это точка?
— Набин

8
Я думаю, что он имел в видуthis.finish();
— Дженс Бодал

69
Это #индикатор, который finish()является нестатическим методом класса Activity. Это недопустимая Java, но она помогает объяснить, как можно использовать метод.
— Брайан Хербст

2
@ Tanis.7x Есть ли индикатор статических методов?
— Бентен

8
@Benten, что будет ., то есть:Activity.someStaticMethod()
— JonnyReeves

81

Просто напишите по нажатию финиша () . Это приведет вас к предыдущей активности.


1
Несмотря на то, что onBackPressed () также работает, я думаю, что это решение лучше для размышлений о выходе из действия, в котором вы нуждаетесь немного ... например, сканер OCR в моем случае. Спасибо!
— Джин Бо

Это удовлетворяет мою потребность .. Спасибо.
— Roon13

68

Просто это

super.onBackPressed();

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

22
Это хакерское. Вы не должны называть это напрямую. Это один из методов жизненного цикла и должен вызываться системой Android.
— Дхирадж Бхаскар

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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

Например, если стек был A-> B-> C-> D и вы запускаете B с этим флагом, стек будет A-> B


Это то, что работает на моем конце. Хотелось бы выяснить, что приведет к тому, что finish () не будет работать.
— Relm

20

Вы хотите взять под контроль поведение кнопки «Назад»? Вы можете переопределить кнопку «Назад» (чтобы перейти к определенному занятию) одним из двух способов.

Для Android 1.6 и ниже:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Или, если вы поддерживаете только Android 2.0 или выше:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Для более подробной информации: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Просто вызовите этот метод, чтобы завершить текущее действие или вернуться к onBackPressed

finish();

ИЛИ

onBackPressed();

Я заставляю пользователя выполнять многие действия один за другим через намерения. Нужно ли что-то делать, чтобы приложение не зависало при слишком большом количестве операций в стеке? Спасибо!
— Ручир Барония

13

если вы хотите перейти к просто хотите перейти к предыдущему использованию активности

finish();

ИЛИ

onBackPressed();

если вы хотите перейти ко второму занятию или ниже, используйте следующее:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
Я обнаружил, что finish () и onBackPressed () оба работают, но, по крайней мере, в моем приложении finish () работает очень медленно, а onBackPressed () намного быстрее. Любопытно.
— Scrayne

Я заставляю пользователя выполнять многие действия один за другим через намерения. Нужно ли что-то делать, чтобы приложение не зависало при слишком большом количестве операций в стеке? Спасибо!
— Ручир Барония

13

Добавьте это в свой метод onCLick (), он вернется к вашему предыдущему действию

Конец();

или вы можете использовать это. У меня отлично сработало

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

11

Если вы правильно настроили файл AndroidManifest.xml с родительским действием, вы можете использовать:

NavUtils.navigateUpFromSameTask(this);

Где это ваш ребенок деятельности.




7

Получил ту же проблему и

finish();  OR super.onBackPressed();

работал нормально для меня, оба работали одинаково, но не повезло с return


6

Начните второе действие, используя намерение (используйте startActivityили в startActivityForResultсоответствии с вашими требованиями). Теперь, когда пользователь нажимает кнопку «Назад», текущая активность сверху будет закрыта, а предыдущая будет отображена.

Теперь допустим, что у вас есть два действия: одно для выбора некоторых настроек для пользователя, таких как язык, страна и т. Д., И после его выбора пользователь нажимает кнопку «Далее», чтобы перейти к форме входа (например). Теперь, если вход в систему неудачен, тогда пользователь будет на входе в систему, что, если вход в систему успешен?

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


Я заставляю пользователя выполнять многие действия один за другим через намерения. Нужно ли что-то делать, чтобы приложение не зависало при слишком большом количестве операций в стеке? Спасибо!
— Ручир Барония

5

Вы можете попробовать это:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

Все новые действия / намерения по умолчанию имеют обратное / предыдущее поведение, если только вы не указали код finish()в вызывающем действии.


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

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

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Попробуйте это, это работает и на кнопке назад панели инструментов как на аппаратной кнопке назад .


2

Я предлагаю NavUtils.navigateUpFromSameTask (), это легко и очень просто, вы можете узнать это у разработчика Google. Хочу помочь вам!


1

Есть несколько случаев, чтобы вернуться к вашей предыдущей деятельности:

Случай 1: если вы хотите вернуть результат к предыдущей активности, тогда ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Случай 2: ActivityA -> FBHelperActivity ----> ActivityA

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

Во-первых, об этом нужно помнить, если вы хотите вернуться к предыдущему занятию. Тогда не вызывайте метод finish (), когда переходите к другому действию с помощью Intent.

После этого у вас есть два способа вернуться от текущей активности к предыдущей:

Просто позвоните: finish()под слушателем нажатия кнопки, или переопределите следующий метод, чтобы вернуться с помощью кнопки возврата системы:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

Помимо всех упомянутых ответов, это все еще альтернативный способ сделать это, скажем, у вас есть два класса, класс A и класс B.

В классе A вы выполнили некоторые действия, такие как выбор флажка, распечатали некоторые данные и намерение передать класс B. В классе B вы хотели бы передать несколько значений в класс A и сохранить прежнее состояние класса A, который вы можете использовать, попробуйте эту альтернативу метод или скачать исходный код, чтобы продемонстрировать это

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

или

http://developer.android.com/reference/android/content/Intent.html


0

Просто попробуйте это, первое занятие

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

В вашем втором занятии

@Override
public void onBackPressed() {
    this.finish();
}

продолжает сбой, данные не сохраняются, я думаю
— Джон Ktejik
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.