问题概述:ActivityA 使用 startActivityForResult
启动 ActivityB。 ActivityB 使用 setResult
设置其结果,然后使用 startActivity
启动 ActivityC。然后,ActivityC 启动设置了 CLEAR_TOP
标志的 singleTop
ActivityA。我希望这会完成 ActivityB 并调用 ActivityA 的 onActivityResult
方法。不幸的是,重新启动 ActivityA 时不会调用此方法。
ActivityA 代码:我已使用 startActivityForResult()
启动了一个 Activity (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 代码:我有一个确认对话框。当用户单击"is"时,他们将设置此 Activity 的结果,
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()
函数,但这并没有发生。
注意:顺便说一句,如果 ActivityB 代码被替换,并且不是从对话框启动 ActivityC,而是调用 finish(),即ActivityC 从未打开,B 只是关闭,然后 doSomethingSpecial() 确实被调用。因此,这个问题似乎源于对返回堆栈和清除顶部的功能缺乏了解。
任何关于为什么这没有按预期表现的帮助将不胜感激!我对此提出了许多技巧,但我最感兴趣的是为什么会发生这种情况,以提高我对 Activity 堆栈的理解。
最佳答案
我认为,从用户的角度来看,您从后面的 Activity (C)“开始”先前的 Activity (A),而不是仅仅“返回”它,会感觉很奇怪。
我相信您应该使用 startActivityWithResult()
从 B 开始 C。然后,当 Activity C 完成时,调用 finish()
。在 B 的 onActivityResult()
中调用 setResult()
,然后调用 finish()
。
关于android - 当 Activity 由 clearTop 完成时 SetResult 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126125/