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.