问题概述:ActivityA使用startActivityForResult
启动ActivityB。 ActivityB使用setResult
设置其结果,然后使用startActivity
启动ActivityC。然后,ActivityC启动singleTop
ActivityA并设置CLEAR_TOP
标志。我希望这可以完成ActivityB并调用ActivityA的onActivityResult
方法。不幸的是,在重新启动ActivityA时不会调用此方法。
ActivityA代码:我已使用{A}的startActivityForResult()
启动了一项活动(ActivityB),其中包含ActivityA的以下代码:
....
final Intent intent = new Intent(this, ActivityB.class);
startActivityForResult(intent, 0);
....
ActivityA中的以下代码等待结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == ACTIVITY_RESULT){
doSomethingSpecial();
}
}
ActivityB代码:我有一个确认对话框。当用户单击“是”时,他们将设置此活动的结果,
private void showConfirmationDialog(String message, final String username) {
AlertDialog.Builder alert = new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(this, ActivityC.class);
setResult(ActivityA.ACTIVITY_RESULT);
startActivity(intent);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
alert.show();
}
ActivityC代码:准备好后,在ActivityC中单击按钮时会调用以下代码:
private void startActivityA(){
Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
我希望调用ActivityA中的doSomethingSpecial()
函数,但这不会发生。
NB :除此之外,如果更换ActivityB代码,而不是从对话框中启动ActivityC,则调用finish()。 ActivityC永远不会打开,B只是关闭,然后确实调用了doSomethingSpecial()
。因此,这个问题似乎源于对后栈和顶部功能缺乏了解。
任何帮助都将被理解为什么这不符合要求!我已经提出了很多关于此问题的讨论,但我最感兴趣的是为什么会这样,以便提高我对活动堆栈的理解。
答案 0 :(得分:2)
我认为从用户的角度来看,你会从以后的活动(C)“开始”前一个活动(A),而不仅仅是“回到”它,这将感到非常奇怪。
我相信你应该用startActivityWithResult()
从B开始C.然后,当活动C完成时,请致电finish()
。在B onActivityResult()
致电setResult()
然后finish()
。