Завершить действие из другого действия
У меня есть 3 действия A, B и C. A ведет к B, что приводит к C. Я хотел бы иметь возможность перемещаться между A и B, но я хочу закончить и A и B, как только C начнется. Я понимаю, как закрыть B при запуске C через намерение, но как мне также закрыть A, когда C запускается?
3 ответа
В вашем 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;
}
затем в C:
public void onCreate(Bundle savedInstanceState) {
if(ActivityA.instance != null) {
try {
ActivityA.instance.finish();
} catch (Exception e) {}
}
}
(Повторите код выше для B, а также A)
Я бы сказал, что это НЕ элегантно и неизбежно приводит к ошибкам в жизненном цикле.
Было бы лучше, если бы вы могли изменить свое требование - если вы не можете, возможно, вы можете использовать одну активность и изменить A, B и C на Fragments
?
Я бы предложил широковещательную рассылку, но, насколько я понимаю, у вас не может быть приемников широковещательной передачи уровня экземпляра для "не возобновленных" операций.
Используя Service
привязка к действиям кажется излишним - но вы можете подумать об этом, если вышеперечисленное не работает.
Удачи!
Я понимаю, что это очень запоздалый ответ, но чувствую 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);
}
Затем в Activity C onCreate() (или когда вы захотите завершить действие A)
Intent local =new Intent();
local.setAction("FINISH_A");
sendBroadcast(local);
Когда вы запускаете 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 закончен или нет.