Завершить родительскую и текущую деятельность в Android - PullRequest
46 голосов
/ 05 августа 2010

У меня есть 3 мероприятия. Действие A, которое приводит к действию B, которое, в свою очередь, может вернуться к действию A или начать действие C. Однако, если я снова нажму на действие C, приложение должно закрыться.

Подводя итог:

  • Задание A начинает задание B
  • Нажатие Назад на мероприятии B должно привести к A
  • Деятельность B начинает деятельность C
  • Нажатие Назад при активности C должно закрыть приложение

Как мне перейти от действия B к C? Этот код в настоящее время дает мне исключение NullPointerException в последней строке:

Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();

Если я переключу последние две строки, я также получу нулевой указатель.

Ответы [ 15 ]

54 голосов
/ 05 августа 2010

Я не знаю, сработает ли это, но вы можете попробовать это:

  • Из действия A запустите действие B для результата, используя startActivityForResult()

  • В операции B, когда пользователь запускает операцию C, запускается операция C.

startActivity() немедленно возвращается, поэтому

  • установить результат, который также сообщит A о завершении,

  • Позвонить finish() в B.

  • Когда A получит этоВ результате B, A также вызывает finish() для себя.

В противном случае вы можете превратить Activity C в свое собственное приложение, а затем закрыть первое приложение (с A & B).после начала второй.

PS Примите к сведению комментарий Фальмарри, когда будете двигаться вперед!
Удачи.

34 голосов
/ 18 октября 2011

Если вы хотите завершить родительское действие из дочернего действия,

В родительском действии, при запуске дочернего действия, используйте следующую команду: -

startActivityForResult(intent_name,any_integer_variable);

и переопределитеМетод onActivityResult следующим образом: -

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode==2){
        finish();
    }
}

Теперь в дочернем действии переопределите onStop и onDestroy следующим образом: -

protected void onStop() {
    setResult(2);
    super.onStop();
}
@Override
protected void onDestroy() {
    setResult(2);
    super.onDestroy();
}

Обратите внимание, что я установилзначение до 2 в дочернем действии, и я проверяю его в родительском действии.Если значение совпадает с заданным мной, то родительское действие также завершится.Затем вы можете использовать рекурсивные подходы для дальнейшей деятельности.

12 голосов
/ 10 августа 2010

Вы должны использовать метод onActivityResult в родительском действии

Предположим, что действие A является родительским для действия B. Если вы хотите нажать кнопку «Назад» в действии B, чтобы выйти из приложения (также выйти из действияA)

В вашей Деятельности B, в onStop() или onDestroy()

вы звоните

setResult(0); //any int number is fine

, и этот код результата передается его родительской активности.

Ваш родительский Actvity A прослушивает код результата, который вам понадобится для использования метода onActivityResult внутри метода, который вы можете вызвать

if(resultCode == 0) //matches the result code passed from B
{
    ActivityA.this.finish()
}

Это работает для меня:)

4 голосов
/ 13 октября 2012

Я этого не делал.Вот как я бы пересмотрел ваш код.

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

Intent whatEverIntentName = new Intent("Path.to.next.Intent");
startActivity(whatEverIntentName);
finish();

Таким образом, вы всегда выходите при нажатии назад.Но ждать!Вы можете изменить способ реагирования на нажатие клавиши «назад» при нажатии.

Сделайте следующее:

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
    startActivity(whatEverIntentName);
// Don't add finish here. 
//This is necessary because you finished your last activity with finish();
}
3 голосов
/ 06 июля 2013

Ничего из этого не сработало для меня. Итак, я нашел решение. В справке четко указано, что Intent.FLAG_ACTIVITY_CLEAR_TASK необходимо использовать с Intent.FLAG_ACTIVITY_NEW_TASK. Вот код, который работал для меня.

Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
2 голосов
/ 07 октября 2014

, если вы находитесь в Занятии A и начали другое занятие, которое называется Занятие B. Занятие A -> Занятие B

А теперь хотите закрыть оба зова.Упражнение B.

B.this.finish();

И используйте этот код в Деятельности A:

startActivity(new Intent(A.this, B.class));
finish();

Как только действие B завершится, действие A также завершится.

ТамЭто один недостаток, я не знаю, может быть, вы этого хотите или нет.

Недостатком является то, что если пользователь находится на мероприятии B и он / она нажимает кнопку назад, чтобы перейти к упражнению A. Затем, упражнение Aи закончите в этом случае.

2 голосов
/ 24 ноября 2012

попробуйте

  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);                
1 голос
/ 13 октября 2017

Вы можете использовать finishAffinity(), это закроет текущую и все родительские активности текущей активности.

Примечание: Но любые результаты от дочерней активности до родительской активности не будут обрабатываться.

Надеюсь, это поможет !!

1 голос
/ 11 декабря 2013

Из действия A запустите действие B для результата, используя startActivityForResult (намерение, 19)

В действии B, когда пользователь запускает действие C, запускается действие C.

startActivity () возвращается немедленно, поэтому

установить результат, который также сообщит А завершиться,

Вызовите финиш () в B. и вызовите метод setResult () перед методом finish () в вашем дочернем действии В родительской активности переопределите метод onActivtyResult (....). Когда A получает этот результат от B, A также вызывает метод finish () для себя.

enter code here
     @Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    //Added by Ashish to close parent activity
      if(arg1==19){
      finish();
        }
    super.onActivityResult(arg0, arg1, arg2);
}
1 голос
/ 05 июня 2013

На экране (B), который вы хотите запустить на экране (C) без заднего экрана, просто запустите этот экран (C) с:

screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(screenC);
finish();

Назад на экране C выйдет из приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...