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

82

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

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

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

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

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

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

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

<code>Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);
</code>

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

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

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

<code>setResult(1);
finish();
</code>
эй, ты хотел закончить одно действие из другого права ... тогда я разместил ответ, который является правильным. Но почему вы проголосовали? Manjunath
Здесь есть ветка с несколькими хорошими ответами:stackoverflow.com/questions/14355731/… a b

Ваш Ответ

9   ответов
2

Я думаю, что у меня есть самый простой подход ... на нажатие нового в 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);
    }
2

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

StartActivityForResult(intent,1003);

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

FinishActivity(1003);
4

Я только что применил решение 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);
}
1

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

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

73

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

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

Error: User Rate Limit Exceededbroadcast_receiverError: User Rate Limit ExceededunregisterReceiver()
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
176
  1. Make your activity A in manifest file: launchMode = "singleInstance"

  2. When the user clicks new, do FirstActivity.fa.finish(); and call the new Intent.

  3. When the user clicks modify, call the new Intent or simply finish activity B.

FIRST WAY

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

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

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

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

SECOND WAY

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

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
10

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

Шаг 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();

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

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
Error: User Rate Limit Exceeded
5

Увидетьмой ответ на вопрос переполнения стекаFinish All previous activities.

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

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

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

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

Error: User Rate Limit Exceeded
16

Это довольно стандартный вопрос общения. Один из подходов заключается в использовании 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());

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Kanika
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы