Подтвердить что ты не робот

Завершите родительскую и текущую активность в Android

У меня есть 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();

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

4b9b3361

Ответ 1

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

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

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

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

  • задайте результат, который также проинформирует A,

  • Вызов finish() в B.

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

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

P.S. Примите во внимание комментарии Фальмарри, когда вы продвигаетесь вперед!
Удачи.

Ответ 2

Если вы хотите закончить родительскую активность из дочернего процесса,

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

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 в дочернем действии и проверяю его в родительской активности. Если значение совпадает с тем, которое я установил, то родительская активность также завершится. Затем вы можете использовать рекурсивные подходы для дальнейших действий.

Ответ 3

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

Предположим, что операция A является родительской для операции B. Если вы хотите нажать кнопку "Назад" в Activity B для выхода из приложения (также выйдите из Activity 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

Чтобы начать действие "B" из действия "A" , используйте метод startActivityForResult следующим образом:

       Intent intent2 = new Intent(A.this,B.class);
       startActivityForResult(intent2,2);

Вместо 2 вы можете использовать любую цифру.

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

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

Не забудьте использовать ту же цифру, которую вы использовали при запуске.

Теперь в действии "B" выполните следующие действия: Чтобы начать работу "C"

     Intent intent3 = new Intent(B.this,C.class);
     startActivityForResult(intent3,3);

Способ реализации

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

Здесь вы заканчиваете операцию "A" , устанавливая результат как 2. Таким образом, завершающая деятельность "B" также завершает деятельность "A" .

И положите строку follwing в действие 'C':

             setResult(3);

Как только начнется ваша активность "C" , ваши предыдущие действия будут завершены.

Таким образом, поддержка активности "C" фактически закрывает приложение.

Ответ 5

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

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

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();
}

Ответ 6

Ничто из этого не сработало для меня. Поэтому я нашел решение. В справке четко указано, что 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);

Ответ 7

попробуйте это

  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);                

Ответ 8

если вы находитесь в действии A и запустили другое действие под названием Activity B. Активность A → Активность B

Теперь нужно закрыть оба действия.

затем используйте приведенный ниже код в Activity B.

B.this.finish();

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

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

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

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

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

Ответ 9

Это прекрасно работает:

btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {

Player.this.finish();
    }
});

Ответ 10

Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

ваша активность C будет работать с корнем и при нажатии на нее завершатся приложения.

Ответ 11

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

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

Снова в screenC выйдет из приложения.

Ответ 12

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

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

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

задайте результат, который также проинформирует A,

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

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);
}

Ответ 13

Попросите каждое действие прослушать результат из следующего действия и закончить сам, если это произойдет.

Вы можете использовать специальный код результата, чтобы указать, что вы хотите завершить работу.

Ответ 14

Вы можете просто переопределить поведение в обратном ключе:

Активность A начинает активность B
Нажатие Назад на активность B должно привести к A
Активность B начинает активность C
Нажатие Назад на активность C должно закрыть приложение

Обратите внимание, что я не называю super из onBackPressed. Это также позволяет вам переопределить механизм стека просмотра для Android, который, как мне кажется, является большим преимуществом, поскольку в настоящее время, похоже, нет способа удалить один самый старый элемент из стека обзора простым способом.

public class B extends Activity
{
    ...
    @Override
    public void onBackPressed()
    {
        // Start activity A
        Intent aIntent = new Intent(this, A);
        startActivity(bIntent);
    }
    ...
}

public class C extends Activity
{
    ...
    @Override
    public void onBackPressed()
    {
        // Close
        finish();
    }
    ...
}

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

Ответ 15

Следующий код должен сделать это за вас. Практически во всех других подходах ваше приложение останется в последних приложениях. Javadoc можно найти по адресу https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()

            ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
            if(am != null) {
                List<ActivityManager.AppTask> tasks = am.getAppTasks();
                if (tasks != null) {
                    tasks.get(0).finishAndRemoveTask();
                }
            }

Ответ 16

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

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

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