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

У меня есть 3 действия A, B и C. A ведет к B, которое ведет к C. Я хотел бы иметь возможность перемещаться вперед и назад между A и B, но я хочу закончить и A, и B, как только начнется C. Я понимаю, как закрыть B при запуске C с помощью намерения, но как закрыть A при запуске C?


person duncanportelli    schedule 03.04.2013    source источник
comment
stackoverflow.com/questions/12947916/   -  person    schedule 03.04.2013
comment
2 недели назад вы задали точно такой же вопрос с точно таким же текстом под другим именем пользователя . Этот вопрос был закрыт как дубликат. Если вы немного поискате в StackOverflow, вы можете найти десятки правильных ответов на свой вопрос.   -  person David Wasser    schedule 03.04.2013
comment
Это была не я. Я видел этот вопрос и перепробовал все ответы, но мне это не удалось. Вот почему я снова задал тот же вопрос   -  person duncanportelli    schedule 03.04.2013


Ответы (4)


В вашем методе onCreate() назначьте статический экземпляр переменной для создания Singleton:

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

(Повторите приведенный выше код для B, а также для A)

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

Было бы лучше, если бы вы могли настроить свое требование - если вы не можете, вы могли бы использовать одно действие и изменить A, B и C на Fragments?

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

Использование Service для привязки к действиям кажется излишним, но вы можете подумать об этом, если вышеперечисленное не работает.

Удачи!

person Graeme    schedule 03.04.2013

Я понимаю, что это очень поздний ответ, но я считаю, что BroadcastReceiver - лучший подход к этому вопросу.

В Упражнении A добавьте это

    //class object
    BroadcastReceiver receiver;

    //add this to onCreate()
    receiver =new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    };
    IntentFilter filter =new IntentFilter();
    filter.addAction("FINISH_A");
    registerReceiver(receiver, filter);

   //add this to Activity A as well
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

Затем в действии C onCreate() (или когда вы хотите завершить действие A)

Intent local =new Intent();
    local.setAction("FINISH_A");
    sendBroadcast(local);
person seekingStillness    schedule 27.08.2020

Когда вы начинаете C с B, делайте это следующим образом:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Теперь C начинается, но A и B уже нет.

Тем не менее, я думаю, что будет лучше, если вы сможете переосмыслить свой дизайн так, чтобы C не зависел от того, закончен A или нет.

person Nazar Merza    schedule 03.04.2013
comment
Нет, с использованием вашего кода C не запустится. B будет завершено, A также будет завершено, а затем будет создан еще один экземпляр A (на основе использования Intent.FLAG_ACTIVITY_CLEAR_TOP) - person David Wasser; 03.04.2013

person    schedule
comment
Пожалуйста, объясните подробнее об этом, чтобы спрашивающий мог понять ваш ответ. - person Niko Adrianus Yuwono; 16.12.2014