Android: поверніться до попередньої активності


524

Я хочу зробити щось просте в додатку для Android. Як можна повернутися до попередньої діяльності.

Який код мені потрібен, щоб повернутися до попередньої діяльності


5
Слідкуйте за останньою відкритою дією
— Вуком

53
Ви просто просте завершення виклику (); Ура
— Nguyen Minh Binh

супер.фініш (); якщо ви телефонуєте йому зсередини діяльності!
— happyhardik

5
Тут одне запитання: Якщо андроїд знищив попередню активність через меншу пам’ять чи інші проблеми, то ця діяльність більше не буде там, у backstack, і що тоді станеться?
— Сонячно

@Sunny Я припускаю, що збирач сміття починається з найвищої активності в стеці. Тож якщо попередньої діяльності не буде, то й поточної активності також не буде. Але я просто припускаю, що тому, що така поведінка мала б більше сенсу, ніж звільнення пам’яті в стеку без особливого порядку. Виправте мій коментар, якщо хтось це точно знає.
— Sedat Kilinc

Відповіді:


486

Діяльність Android зберігається в стеку активності. Повернення до попередньої діяльності може означати дві речі.

  1. Ви відкрили нову діяльність з іншої діяльності за допомогою startActivityForResult . У такому випадку ви можете просто зателефонувати з функцією FinActivity () з вашого коду, і вона поверне вас до попередньої діяльності.

  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 (), ви можете закрити фінішним завершенням () (не потрібно передавати жоден параметр)
— neworld

3
Чи можете ви уточнити, де і як ви використовуєте фініш (), тож коли користувач натискає кнопку вгору, це переводить їх на попередню активність
— RicNjesh

4
@RicNjesh У вашому методі onOptionsItemSelected, якщо у меню натиснуто меню, є ідентифікатор R.id.home, то виклик закінчується (). Це закриє поточну активність і поверне вас до активності, яка розпочалася з startActivity ()
— Anders Ullnæss

Мені спонукає користувачів здійснювати багато заходів одна за одною через наміри. Чи потрібно мені щось робити, щоб переконатися, що додаток не виходить з ладу із занадто великою кількістю дій на стеці? Дякую!
— Ручір Баронія

1
ви впевнені, що діяльність 1 не загине в якийсь момент, перш ніж ви навіть закінчите діяльність 2?
— user924

225

Спробуйте Activity#finish(). Це більш-менш те, що робить кнопка "Назад" за замовчуванням.


1
чому #? чи це крапка?
— Набін

8
Я вважаю, що він мав на увазіthis.finish();
— Єнс Бодал

69
Це #показник, який finish()є нестатичним методом класу Діяльність. Це неправдивий Java, але він допомагає пояснити, як можна використовувати метод.
— Брайан Гербст

2
@ Tanis.7x Чи є і показник для статичних методів?
— Бентен

8
@Benten це було б ., тобто:Activity.someStaticMethod()
— JonnyReeves

81

Просто напишіть на кнопці закінчення () . Це перенесе вас до попередньої діяльності.


1
Хоча onBackPress () також працює, я думаю, що це рішення краще для роздумів про вихід із діяльності, яка вам потрібна лише на трохи. Наприклад, сканер OCR у моєму випадку. Дякую!
— Джин Бо

Це задовольняє мою потребу .. Дякую.
— Roon13

68

Тільки в цьому

super.onBackPressed();

2
Цей виклик просто закінчує поточну активність, тому він відображатиме останню видиму активність. Однак якщо попередньої активності немає або вона тим часом знищується, програма може вийти.
— r1k0

22
Це хакі. Ви не повинні це телефонувати безпосередньо. Це один із методів життєвого циклу, і його слід назвати системою андроїд.
— Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Це призведе до попередньої діяльності, зберігаючи її стек і очищаючи всі дії після цього зі стека.

Наприклад, якщо стек був A-> B-> C-> D і ви починаєте B з цим прапором, стек буде A-> B


Це те, що працює на моєму кінці. Хочеться дізнатися, що може спричинити, що закінчення () не працює.
— 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

Просто зателефонуйте цим методам, щоб закінчити поточну діяльність або повернутися назад onBackPress

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
Я виявив, що обробка () і onBackPress () працюють обоє, але, принаймні, в моєму додатку закінчення () дуже повільне, а onBackPress () - набагато швидше. Цікавий.
— 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. Після успішного входу поверніть дані ОК до першої активності та закрийте вхід. Тепер, коли дані отримані, тоді запустіть третю активність і закрийте першу активність, використовуючи фініш.


Мені спонукає користувачів здійснювати багато заходів одна за одною через наміри. Чи потрібно мені щось робити, щоб переконатися, що додаток не виходить з ладу із занадто великою кількістю дій на стеці? Дякую!
— Ручір Баронія

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

По-перше, потрібно пам’ятати, що, якщо ви хочете повернутися до попередньої діяльності. Тоді не викликайте метод закінчення (), коли переходите до іншої діяльності з використанням Intent.

Після цього у вас є два способи повернутися від поточної діяльності до попередньої діяльності:

Просто зателефонуйте: finish()під натисканням кнопки слухача або замініть наступний метод для повернення за допомогою кнопки повернення системи:

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

0

Окрім усіх згаданих відповідей, їхній спосіб все ще є альтернативним способом, скажімо, у вас є два класи, клас А і клас Б.

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

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.