Як закрити діяльність та повернутися до попередньої діяльності в android


144

У мене головна діяльність, коли я натискаю кнопку, починає нову діяльність, я для цього використовував такий код:

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

Вищевказаний код був запущений з основної діяльності.

Тепер у моїй новій діяльності, яку називають основною діяльністю, у мене є кнопка "назад". Коли я натискаю на цю кнопку назад, я хочу, щоб моя нова діяльність закрилася, і вона повинна повернутися до початкової основної діяльності.

Я спробував дзвонити super.finish()і просто finish() (з нової діяльності), але це закриває всю мою програму (включаючи основну діяльність).

Як я можу просто закрити діяльність, яка зараз зосереджена, а потім повернутися до основної діяльності?

ВИДАЛЕНО

Той факт, що кнопка повернення мого телефону також закриває весь додаток, примушує мене думати, що я почав другу діяльність неправильно?


Добре, я дивився,

Я створив активність налаштувань, яка використовує той самий код маніфесту та той самий код, щоб розпочати діяльність.

Що стосується налаштувань Активність, коли я натискаю кнопку назад, вона повертається до Основної діяльності.

Згадана вище активність у головному запитанні просто закриває весь мій додаток.

Отже, проблема, мабуть, не в коді для завершення діяльності, а в самій діяльності.


4
Вам навіть не потрібна кнопка повернення, просто дозвольте користувачеві використовувати клавішу повернення телефону, і вам нічого не потрібно робити.
Hoan Nguyen

Кнопка повернення телефонів закриває заявку на вхід, не лише мою вторинну діяльність. Я не хочу закривати основну діяльність.
Zapnologica

1
Кнопка "назад" не повинна робити цього - чи можете ви показати більше свого коду?
peejaybee

Відповідаючи на вашу редагування, вторинна активність виглядає добре від публікацій. Я думаю, що TGMCians, ймовірно, має правильну відповідь, і ви досліджуєте свій маніфест.
peejaybee

дивіться цю відповідь, я думаю, що це допоможе вам
Мухаммед

Відповіді:


201

Я думаю, ви зателефонували finish()до того, MainActivityяк розпочати SettingsActivity.

Описаний вами сценарій відбуватиметься двома способами:

ВСЕ

Ви встановили android:noHistory = "true"для MainActivityвнутрішньої , AndroidManifest.xmlщо призводить MainActivityдо finishавтоматично при натисканні на клавішу повернення.

АБО

Перш ніж перейти на "SettingsActivity", ви зателефонували finish()у свій MainActivity, що вбиває його. Коли ви натискаєте кнопку "назад", оскільки жодна інша активність не встановлена ​​у стеку для появи, вона повертається на головний екран.


Це пояснить, чому кнопка «назад» телефону також відхиляє основну діяльність.
peejaybee

Під час налагодження я помітив, що виконання продовжується після закінчення (), тому доцільно додатково поставити повернення.
до

Чи не третя причина цієї відповіді - це лише повторення першої?
Панг

60

Ви можете повернутися до попередньої діяльності, просто зателефонувавши до кінця () у активності, яку ви займаєтесь. Зверніть увагу на будь-який код після запуску виклику закінчення () - ви можете просто зробити повернення після виклику закінчити (), щоб виправити це.

Якщо ви хочете повернути результати до однієї активності, тоді для початку другої роботи вам потрібно:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Всередині вашої діяльності, що викликається, ви можете отримати Намір за допомогою параметра onCreate () або використати

getIntent();

Щоб встановити результат повернення до активності один, тоді у діяльності два зробіть

setResult(Activity.RESULT_OK, MyIntentToReturn);

Якщо ви не маєте наміру повертатися, тоді просто скажіть

setResult(Activity.RESULT_OK);

Якщо активність має погані результати, ви можете використовувати Activity.RESULT_CANCELED (це використовується за замовчуванням). Тоді в діяльності, яку ви робите

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Для завершення занять два використовуйте ті самі методи з закінченням (), як описано вище, при вже встановлених результатах.


1
"Зауважте, що будь-який код буде запущений після виклику закінчення () - ви можете просто зробити повернення після виклику закінчити (), щоб виправити це" Я думаю, що "виправити" тут поганий вибір слів. Це більше схоже на те, що ви уникаєте виконання наступних рядків (не виправлення).
Ло-Тан

14

Коли ви натискаєте кнопку, ви можете викликати її:

super.onBackPressed();

12

якщо ви використовуєте фрагмент u, слід використовувати

getActivity().onBackPressed();

якщо ви використовуєте одну активність, яку можете використовувати

finish();

7

спробуйте цей код замість finish:

onBackPressed();


2
Чудово працює для повернення з ActivityB до ActivityA. Для фрагментів та окремих заходів можна використати відповідь @Osama Ibrahim.
Ефтехарі

4

Ви робите це занадто важко. Якщо я зрозумів, що ви намагаєтеся зробити правильно, вбудована кнопка «назад» і сам Android зробить всю роботу за вас: http://developer.android.com/guide/components/tasks-and-back- stack.html

Крім того, реалізація спеціальної кнопки "назад" порушує основні Правила якості програми UX-N1: http://developer.android.com/distribute/googleplay/quality/core.html


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});

4

Це закриває всю програму:

this.finish();

Це закриває всю програму, як зазначено в його питанні, а не тільки про поточну активність. Як кнопка повернення телефонів?
Zapnologica

Як перейти до попередньої активності від діяльності на камері.
coderpc

2
Ні, це не так. Це лише закриває поточну активність. Дивіться: developer.android.com/reference/android/app/…
Фірзен

4

Я вважаю, що ваша друга діяльність, мабуть, не пов’язана з вашою основною діяльністю як дитяча діяльність. Перевірте свій AndroidManifest.xmlфайл і перевірте, чи <activity>містить запис android:parentActivityNameатрибута для вашої дитини . Це має виглядати приблизно так:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Просто не закликайте finish()своїх, MainActivityтоді це позбавить від необхідності переосмислити onBackPressed()своє, SecondActivityякщо ви не робите інших дій у цій функції. Якщо ви відчуваєте "потребу" в цій кнопці "назад", тоді ви можете просто зателефонувати finish()на, SecondActivityі це приведе вас до MainActivityтих пір, поки ви не зателефонували finish()на неї


Я спробував цей маршрут, але у мене є близько 10 екранів послідовно, які використовують PNG з високою роздільною здатністю. Проблема полягає в тому, що приблизно на екрані 7 пристрій залишається без запам’ятовування через усі дії в бек-стеці. Я вирішив зателефонувати на завершення кожної діяльності, і це вирішило проблему, дозволяючи збирання сміття, але тепер поведінка ззаду потребує кодування вручну, оскільки резервний стек тепер порожній. Ви зіткнулися з цією проблемою чи знаєте якісь механізми Android для вирішення цього питання?
Ло-Тан

Що ви хочете робити кнопку назад? Повернутися до того, що Activityбуло раніше, або завжди повернутися до MainActivity? Крім того, якщо у вас не вистачає пам'яті, Bitmapsвам слід прочитати цю частину Документів . Це мені допомогло
codeMagic

@ Lo-Tan, якщо ви хочете повернутися до попередньої діяльності, то, я думаю, вам потрібно розібратися в управлінні пам’яттю для своїх зображень, а не закінчувати діяльність (можливо, за посиланням, яке я надав). В іншому випадку вам доведеться відтворити новий екземпляр діяльності та спробувати розібратися, до якого повернутися
codeMagic

Я хотів би, щоб кнопка "Назад" просто перейшла на попередній екран. Це, в основному, серія навчальних екранів, і користувач може йти вперед / назад. Кожен екран розроблений і використовує багато PNG - іноді PNG, які займають більшу частину екрана (не лише маленькі ескізи), тому він висмоктує багато пам'яті для кожного екрана.
Ло-Тан

@ Lo-Tan Я думаю, що ви хочете змінити метод onBackPress (), а потім просто вручну створити діяльність, до якої ви хочете перейти. Потім ви можете закінчити ту, на якій ви перебуваєте, та запустити попередню.
Zapnologica

1

Я не знаю, чи це навіть корисно чи ні, але я боровся з тією ж проблемою, і я знайшов досить простий спосіб із лише глобальною булевою змінною та дією onResume (). У моєму випадку моя активність C, якщо натиснути певну кнопку, вона повинна викликати закінчення () діяльності B!

Activity_A -> Activity_B -> Activity_C

Activity_A (відкривається зазвичай Activity_B)

Activity_B (на деякій кнопці відкривається Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Отже, кожного разу, коли я натискаю кнопку на Activity C, вона виконуватиме функцію "onResume ()" діяльності B і повертається до діяльності A.


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

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

        return super.onOptionsItemSelected(item);
    }

Спробуйте це працює як на кнопці повернення панелі інструментів, так і в якості апаратної кнопки повернення .


Цей працював на мене. Я також мав MainActivity і SettingsActivity з android:parentActivityName=".MainActivity"для другого. Цей код обробляє цю кнопку Home / Back в панелі інструментів і просто закінчує поточну активність, повертаючись до попередньої в стеку. Дякую.
mortalis

1

Завершення закриває всю програму, це те, що я ненавиджу в розробці Android, не закінчую, це добре, але те, що вони не стежать за гарним синтаксисом

startActivity(intent)

Чому ні

closeActivity (наміри)?


1
Чи відповідає це на питання? Або це лише пропозиція, яку слід спробувати? В обох випадках
ціна

1

Ми стикалися з дуже подібною ситуацією.

Діяльність 1 (Відкриття) -> Діяльність 2 (Попередній перегляд) -> Діяльність 3 (Докладно)

Неправильна "на звороті натисніть" Відповідь

  • Натиснення назад пристрою на "Активність 3" також закриє "Дія 2".

Я перевірив усі відповіді, розміщені вище, і жоден з них не працював. Синтаксис Java для переходу між активністю 2 та активністю 3 було перевірено на правильність.

Свіжий від кодування при виклику стороннього додатка. за діяльністю Ми вирішили дослідити кут конфігурації - врешті-решт, це дозволить нам виявити першопричину проблеми.

Область застосування : Налаштування діяльності 2 (абонент).

Причинна причина :

android:launchMode="singleInstance"

Рішення :

android:launchMode="singleTask"

Мабуть, у цій проблемі «on back press» видача singleInstance вважає викликом «Активність» в одному екземплярі з викликом «Діяльність», тоді як SingleTask дозволить викликати «Діяльність», які мають власну ідентифікацію, достатню для того, щоб передбачувана кнопка натискала, щоб вона працювала як слід.


0
{ getApplicationContext.finish();   }

Спробуйте цей метод ..


Хоча цей блок коду може відповісти на питання, було б краще, якщо ви могли б дати невелике пояснення, чому це робиться.
Девід

0

можливо, ви викликаєте закінчення (); у події кнопки натискання, тому основна активність закривається одразу після натискання на кнопку, і коли ви повертаєтесь із наступної діяльності, програма закривається, оскільки основна діяльність вже закрита, і немає активної активності.


0

onCreate метод вашої діяльності напишіть наступний код.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Потім перейдіть на вибраний метод своєї діяльності onOptionsItem наступним чином

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

І вам добре піти.


0

Ви повинні використовувати це у своїй MainActivity

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Прапор запустить декілька завдань, які зберігатимуть Вашу MainActivity, коли ви зателефонуєте до кінця, він знищить іншу активність і поверне вас до MainActivity

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.