Завершить действие из другого действия

Я хочу завершить одно действие из другого, например:

В действии [A], при нажатии кнопки, я вызываю действие [B] без завершения действия [A].

Теперь в Activity [B] есть две кнопки, New и Modify. Когда пользователь нажимает кнопку "Изменить", извлекает действие [A] из стека со всеми отмеченными параметрами.

Но когда пользователь нажмет на кнопку "Создать" в Activity [B], мне придется закончить Activity [A] из стека и снова загрузить эту Activity [A] в стек.

Я пытаюсь это сделать, но я не могу завершить действие [A] из стека... Как я могу это сделать?

Я использую код как:

Из Деятельности [A]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

Другой метод в той же деятельности

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

А в Activity [B], по нажатию кнопки:

setResult(1);
finish();

11 ответов

Решение
  1. Сделайте свою деятельность A в файле манифеста: launchMode = "singleInstance"

  2. Когда пользователь нажимает новый, сделайте FirstActivity.fa.finish(); и назовите новое намерение.

  3. Когда пользователь нажимает изменить, вызовите новое намерение или просто завершите действие B.

ПЕРВЫЙ ПУТЬ

В первом упражнении объявите Activity object как это,

public static Activity fa;
onCreate()
{
    fa = this;
}

Теперь используйте этот объект в другом Activity чтобы закончить первое действие, как это,

onCreate()
{
    FirstActivity.fa.finish();
}

ВТОРОЙ ПУТЬ

Во время вызова вашей деятельности FirstActivity который вы хотите закончить, как только вы двигаетесь дальше, вы можете добавить флаг во время вызова FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Но с использованием этого флага действие будет завершено, даже если вы этого не хотите. и когда-нибудь onBack если вы хотите показать FirstActivity Вы должны будете назвать это, используя намерение.

Это вы можете сделать, но я думаю, что вы не должны нарушать нормальный поток активности. Если вы хотите завершить упражнение, вы можете просто отправить трансляцию из занятия B в упражнение A.

Создайте приемник вещания, прежде чем начинать свою деятельность. B:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

Отправьте трансляцию из действия B в действие A, если хотите завершить действие A из B

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

Я надеюсь, что это будет работать для вас...

Это довольно стандартный вопрос общения. Один из подходов заключается в использовании ResultReceiver в действии A:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

и затем в Деятельности B вы можете просто закончить это по требованию, например, так:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

Попробуйте что-нибудь подобное.

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

Шаг 1: Начните упражнение B с занятия A

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

Шаг 2: Если пользователь нажимает кнопку "Изменить", запустите упражнение A, используя FLAG_ACTIVITY_CLEAR_TOPТакже передайте флаг в доп.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Шаг 3: Если пользователь нажимает кнопку "Добавить", запустите упражнение A, используя FLAG_ACTIVITY_CLEAR_TOPТакже передайте флаг в доп. FLAG_ACTIVITY_CLEAR_TOP очистит все открытые действия до цели и перезапустится, если в целевой операции не определен режим запуска

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

Шаг 4: сейчас onCreate() метод действия A, необходимо получить этот флаг.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}

Начните свою деятельность с кода запроса:

StartActivityForResult(intent,1003);

И вы можете закрыть его от любого другого действия, как это:

FinishActivity(1003);

Я только что применил решение Непстера и работает как шарм. Есть небольшая модификация, чтобы запустить его из фрагмента.

К вашему фрагменту

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

И к вашему OnNewIntent() действия, которое вы хотели бы перезапустить.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

Смотрите мой ответ на вопрос переполнения стека. Завершить все предыдущие действия.

Что вам нужно, это добавить Intent.FLAG_CLEAR_TOP, Этот флаг гарантирует, что все действия над целевым действием в стеке завершены и что оно отображается.

Еще одна вещь, которая вам нужна, это SINGLE_TOP флаг. С помощью этой функции вы запрещаете Android создавать новое действие, если оно уже создано в стеке.

Просто будьте осторожны, что если действие уже было создано, намерение с этими флагами будет доставлено в методе, называемом onNewIntent(intent) (вам нужно перегрузить его, чтобы справиться с этим) в целевой деятельности.

Затем в onNewIntent у вас есть метод, называемый рестарт или что-то, что будет вызывать finish() и начать новое намерение к себе, или иметь repopulate() метод, который установит новые данные. Я предпочитаю второй подход, он дешевле и вы всегда можете извлечь onCreate логика в отдельный метод, который вы можете вызвать для заполнения.

Я думаю, что у меня есть самый простой подход... на нажатие нового в B..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

и в получить его

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

Я знаю, что это старый вопрос, некоторые из этих методов не сработали для меня, так что для тех, кто смотрит в будущее или у меня проблемы, это сработало для меня

Я переиграл onPause и называется finish() внутри этого метода.

Я хочу, чтобы вы посмотрели здесь. Работает полностью и без проблем.

Деятельность а

public static ActivityA instance = null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instance = this;
}

@Override
public void finish() {
    super.finish();
    instance = null;
}

Деятельность б

public void onCreate(Bundle savedInstanceState) {
    if(ActivityA.instance != null) {
        try {  
            ActivityA.instance.finish(); 
        } catch (Exception e) {}
    }
}

Первый вызов startactivity(), чем использование finish()

Другие вопросы по тегам