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

146

У меня есть основное действие: когда я нажимаю кнопку, запускается новое действие, для этого я использовал следующий код:

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

Приведенный выше код был запущен из основного действия.

Теперь в моем новом действии, которое вызывается основным действием, у меня есть кнопка возврата. Когда я нажимаю эту кнопку "Назад", я хочу, чтобы мое новое действие закрывалось, и оно должно вернуться к исходному основному действию.

Я пробовал позвонить super.finish()и просто finish() (из нового действия), но это закрывает все мое приложение (включая мое основное действие).

Как я могу просто закрыть действие, которое в данный момент находится в фокусе, а затем вернуться к основному действию?

ИЗМЕНЕНО

Тот факт, что кнопка "Назад" на моем телефоне также закрывает все мое приложение, заставляет меня думать, что я неправильно запустил второе действие?


Хорошо, я искал,

Я создал действие настроек, которое использует тот же код манифеста и тот же код для запуска действия.

Для настроек «Активность», когда я нажимаю кнопку «Назад», он возвращается к основному действию.

При активности, упомянутой выше в основном вопросе, он просто закрывает все мое приложение.

Таким образом, проблема, похоже, не в коде завершения действия, а в самом действии.

Запнологика
источник
4
Вам даже не нужна кнопка возврата, просто позвольте пользователю использовать кнопку возврата телефона, и вам не нужно ничего делать.
Hoan Nguyen
Кнопка возврата телефона закрывает заявку на вход, а не только мою второстепенную деятельность. Не хочу закрывать основную деятельность.
Zapnologica
1
Кнопка «назад» этого делать не должна - можете ли вы показать больше кода?
peejaybee
В ответ на ваше редактирование вторичное действие выглядит хорошо на основе того, что вы опубликовали. Я думаю, что у TGMCians, вероятно, есть правильный ответ, и вы исследуете свой манифест.
peejaybee
см. этот ответ, я думаю, это поможет вам
Мухаммад Хельми

Ответы:

205

Я думаю, вы вызываете finish()метод MainActivityперед тем, как начать SettingsActivity.

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

ЛИБО

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

ИЛИ

Прежде чем переключиться на «SettingsActivity», вы вызвали finish()свой MainActivity, который убивает его. Когда вы нажимаете кнопку «Назад», поскольку в стеке не задано другое действие, оно возвращается на главный экран.

Аджай С
источник
Это объясняет, почему кнопка «Назад» на телефоне также отключает основное действие.
peejaybee
При отладке я заметил, что выполнение продолжается после finish (), поэтому рекомендуется добавить возврат.
до
Разве третья причина в этом ответе не повторение первой?
Pang
61

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

Если вы хотите вернуть результаты для первого действия, то при запуске второго действия вам потребуется:

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...
}

Чтобы завершить упражнение два, используйте те же методы с finish (), как описано выше, с уже установленными результатами.

jjNford
источник
1
«Обратите внимание, что любой код после вызова finish () будет запущен - вы можете просто выполнить возврат после вызова finish (), чтобы исправить это» Я думаю, что слово «исправить» здесь плохой выбор. Это больше похоже на то, что вы избегаете выполнения следующих строк (не исправляете).
Lo-Tan
15

Когда вы нажимаете кнопку, вы можете вызвать:

super.onBackPressed();
Забадор
источник
13

если вы используете фрагмент, вы должны использовать

getActivity().onBackPressed();

если вы используете одно действие, вы можете использовать

finish();
Усама Ибрагим
источник
7

попробуйте этот код вместо finish:

onBackPressed();

Саназ Афзали
источник
2
Прекрасно работает для возврата с ActivityB на ActivityA. Для фрагментов и отдельных действий можно использовать ответ @Osama Ibrahim.
Eftekhari
7

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

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...
Тревор
источник
4

Вы слишком усложняете это. Если я понимаю, что вы пытаетесь сделать правильно, встроенная кнопка «назад» и сам Android сделают всю работу за вас: http://developer.android.com/guide/components/tasks-and-back- stack.html

Кроме того, реализация настраиваемой кнопки «назад» нарушает основные рекомендации по обеспечению качества приложений UX-N1: http://developer.android.com/distribute/googleplay/quality/core.html.

Peejaybee
источник
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();
Логар314159
источник
Это закрывает все приложение, как указано в вопросе, а не только текущую активность. Как и кнопка возврата на телефоне?
Zapnologica
Как перейти к предыдущей активности из активности камеры.
coderpc
2
Нет, это не так. Он только закрывает текущую активность. См .: developer.android.com/reference/android/app/…
Фирзен,
1

Просто не обращайтесь finish()к вам, MainActivityтогда это устраняет необходимость переопределения вашего onBackPressed()в вашем, SecondActivityесли вы не делаете другие вещи в этой функции. Если вы чувствуете «потребность» в этой кнопке возврата, вы можете просто позвонить finish()по номеру, SecondActivityи он доставит вас к себе, MainActivityпока вы не позвонили finish()по нему.

codeMagic
источник
Я пробовал этот путь, но у меня последовательно около 10 экранов используют PNG с высоким разрешением. Проблема в том, что примерно на экране 7 на устройстве закончилась память из-за всех действий в заднем стеке. Я решил вызывать завершение для каждого действия, и это устранило проблему, разрешив сборку мусора, но теперь обратное поведение необходимо кодировать вручную, потому что задний стек теперь пуст. Вы сталкивались с этой проблемой или знаете какие-либо механизмы в Android для ее решения?
Lo-Tan
Что вы хотите, чтобы кнопка возврата делала? Вернуться к тому, что было раньше, Activityили всегда возвращаться к MainActivity? Кроме того, если у вас заканчивается память, Bitmapsвам следует прочитать эту часть документации . Мне помогло
codeMagic
@ Lo-Tan, если вы хотите вернуться к предыдущему действию, я думаю, вам нужно выяснить управление памятью для ваших изображений, а не завершать действия (возможно, с помощью ссылки, которую я предоставил). В противном случае вам придется воссоздать новый экземпляр активности и попытаться выяснить, к какому из них вернуться
codeMagic
Я бы хотел, чтобы кнопка «Назад» просто вернулась к предыдущему экрану. По сути, это серия обучающих экранов, на которых пользователь может переходить вперед / назад. Каждый экран разработан и использует множество png-файлов - иногда png-файлы, которые занимают большую часть экрана (а не только маленькие эскизы), поэтому для каждого экрана требуется много памяти.
Lo-Tan
@ Lo-Tan Я думаю, вы хотите переопределить метод onBackPressed (), а затем просто вручную создать действие, к которому вы хотите перейти. Затем вы можете завершить предыдущий и запустить предыдущий.
Zapnologica
1

Я не знаю, полезно это или нет, но я боролся с той же проблемой, и я нашел довольно простой способ, только с глобальной логической переменной и действием onResume (). В моем случае действие C при нажатии определенной кнопки должно запускать finish () Activity 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 () для Activity B и возвращается к Activity A.

user2742861
источник
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

Finish закрывает все приложение, это то, что я ненавижу в разработке Android. Не завершать, это нормально, но они не успевают за синтаксисом ok, который у них есть

startActivity(intent)

Почему нет

closeActivity (намерение)?

Кент Хансен
источник
1
Это ответ на вопрос? Или это всего лишь предложение, которое стоит попробовать? В обоих случаях напыщенная речь не нужна и, вероятно, не приветствуется на SO
Gilles Gouaillardet
1

Мы столкнулись с очень похожей ситуацией.

Действие 1 (Открытие) -> Действие 2 (Предварительный просмотр) -> Действие 3 (Подробности)

Неверный ответ "на обратное нажатие"

  • Повторное нажатие устройства на Activity 3 также закроет Activity 2.

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

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

Объем : Настройка действия 2 (вызывающий).

Основная причина :

android:launchMode="singleInstance"

Решение :

android:launchMode="singleTask"

По-видимому, в этой проблеме «при обратном нажатии» singleInstance рассматривает вызываемые Activity в одном экземпляре с вызывающим Activity, тогда как singleTask позволяет вызываемым Activity иметь собственную идентичность, достаточную для того, чтобы предполагаемое обратное нажатие функционировало, чтобы работать должным образом .

Ворон
источник
0
{ getApplicationContext.finish();   }

Попробуйте этот метод ..

Абхишек
источник
Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли дать небольшое объяснение, почему он это делает.
Дэвид
0

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

Раман Райат
источник
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, когда вы вызовете finish, он убьет другую активность и вернет вас к MainActivity.

Рафат
источник