У меня есть 3 действия A, B и C. A ведет к B, которое ведет к C. Я хотел бы иметь возможность перемещаться вперед и назад между A и B, но я хочу закончить и A, и B, как только начнется C. Я понимаю, как закрыть B при запуске C с помощью намерения, но как закрыть A при запуске C?
Завершить действие из другого действия
Ответы (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
для привязки к действиям кажется излишним, но вы можете подумать об этом, если вышеперечисленное не работает.
Удачи!
Я понимаю, что это очень поздний ответ, но я считаю, что 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);
Когда вы начинаете 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 или нет.
C
не запустится. B
будет завершено, A
также будет завершено, а затем будет создан еще один экземпляр A
(на основе использования Intent.FLAG_ACTIVITY_CLEAR_TOP
)
- person David Wasser; 03.04.2013