Android-返回到具有不同意图值的上一个活动

Android-返回到具有不同意图值的上一个活动,android,android-activity,Android,Android Activity,我有一个具有此转换的应用程序: A -> B -> C -> D-> C 在输入C时,我必须检查一个标志。然后我必须将它作为intent(比如说intentX=false)传递给D。在D中执行某些操作后,按下按钮后将返回到C。 我所做的只是再次传递值为true的intentX,然后再次启动C。 因此,它创建了另一个活动C 我想做的是,我不必启动新的活动C,只需调用super.onBackPressed(),即可使用以前的C。但是我无法传递intentX的新值。有没有别

我有一个具有此转换的应用程序:

 A -> B -> C -> D-> C
在输入
C
时,我必须检查一个标志。然后我必须将它作为intent(比如说
intentX=false
)传递给
D
。在
D
中执行某些操作后,按下按钮后将返回到
C
。 我所做的只是再次传递值为true的
intentX
,然后再次启动C。 因此,它创建了另一个活动C


我想做的是,我不必启动新的活动C,只需调用
super.onBackPressed()
,即可使用以前的C。但是我无法传递
intentX
的新值。有没有别的办法,来实现我想要的。我可能错过了一些

您需要的是
startActivityForResult()
。当您从
C
转到
D
时,不要使用
startActivity()
而是使用
startActivityForResult()
。然后,当您想从
D
返回到
C
时,可以使用
setResult()
,它可以包含一个
Intent
对象和
extras
传递回
C

如果不需要,我不建议您在
onBackPressed()
中执行此操作,因为这不是用户所期望的。相反,您应该返回带有此数据的事件,如
按钮
单击

因此,在
C
中,您将执行以下操作

 Intent i = new Intent(new Intent(C.this, D.class);
 startActivityForResult(i, 0);
然后在
D
中准备返回

 Intent i = new Intent();
 i.putExtra();  // insert your extras here
 setResult(0, i);
然后,当您返回到
C
时,您将输入此方法()


在某些情况下,实际上不需要startActivityForResult,或者将所有startActivity调用更改为startActivityForResult是不切实际的

如果需要“再次”开始上一个活动的简单情况,我的建议是:使用标志\u activity\u CLEAR\u TOP标志

引用一段简短的话:

如果已设置,则正在启动的活动已在中运行 当前任务,而不是启动该任务的新实例 活动,其上的所有其他活动都将关闭,并且 此意图将作为一个整体传递给(现在位于顶部)旧活动 新的意图

例如,考虑一个由活动组成的任务:A、B、C、D. 如果D调用startActivity()的目的是解决 活动B的组件,然后C和D将完成,B将收到 给定的意图,导致堆栈现在为:A,B

所以这个例子

   // From ActivityD
   Intent intent = new Intent(getApplicationContext(), ActivityB.class);
   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted
   intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new..
   startActivity(intent);
您将在何处获得新的意图由哪个启动模式和用于启动它的标志(在本例中是我们的ActivityB)定义

上面示例中当前正在运行的活动B实例将 要么接收你从这里开始的新意图 onNewIntent()方法,或使用新的 意图如果它已宣布其启动模式为“多个”(即 默认设置)并且您没有在同一个目录中设置标志\活动\单个\顶部 意图,然后它将被完成并重新创建;对于所有其他发射 模式,或者如果设置了标志\u活动\u单个\u顶部,则此意图将被忽略 已传递到当前实例的onNewIntent()


哦,我得再试一次。我以前肯定用错了。这是可能的,在你了解它的工作原理之前,一开始很容易弄糊涂。这应该足以让你开始,但在我链接到的文档以及谷歌和SOW上的教程和示例中也有一个不错的例子。当你在设置结果后“准备返回”时,应该调用什么函数?我是否应该调用
finish()
?@AlexanderFarber,这取决于具体情况。通常是的,就像将返回代码放入
onClick()
事件中一样。如果它在
onBackPressed()
中,那么您只需调用
super.onBackPressed()
,因为这需要它完成
finish()
过程,因此无需在那里调用它。
   // From ActivityD
   Intent intent = new Intent(getApplicationContext(), ActivityB.class);
   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted
   intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new..
   startActivity(intent);