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.