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

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

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

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

Но когда пользователь нажимает кнопку Новая из Activity [B], мне придется завершить Activity [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);
        }
    }
}

И в действии [B] нажмите кнопку:

setResult(1);
finish();

Ответ 1

  • Сделайте свою активность A в файле манифеста: launchMode = "singleInstance"

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

  • Когда пользователь нажимает на изменение, вызывает новый Intent или просто завершает действие 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, вам придется называть его с помощью намерения.

Ответ 2

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

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

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

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

Ответ 3

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

а затем в Activity B вы можете просто закончить его по требованию следующим образом:

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

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

Ответ 4

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

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

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

Шаг 2: Если пользователь нажимает кнопку "Изменить", запускайте FLAG_ACTIVITY_CLEAR_TOP 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: Если пользователь нажимает кнопку "Добавить", запускайте FLAG_ACTIVITY_CLEAR_TOP 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() в Activity A должен получить этот флаг.

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Ответ 7

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

StartActivityForResult(intent,1003);

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

FinishActivity(1003);

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Активность a

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

Ответ 11

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