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


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

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

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

но когда пользователь нажимает на новая кнопка из Activity [B], тогда у меня будет чтобы завершить действие [A] из стека и снова загрузить это действие [a] в стек.

Я пытаюсь это сделать, но я не могу закончить Activity [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 76

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
}

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

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

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

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

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

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

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

// 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 intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

и в A get it

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

активность b

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

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

StartActivityForResult(intent,1003);

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

FinishActivity(1003);

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