使用startActivityForResult,如何获取子活动中的requestCode?

我有四个活动,说A,B,C和D.我的情况是A将通过startActivityForResult启动活动B.

startActivityForResult(new Intent(this,B.class),ONE); 

在其他情况下,我会B与其他情况。 喜欢

  startActivityForResult(new Intent(this,B.class),TWO); 

在B我需要检查我需要调用C或D取决于requestCode。 即如果一个需要启动C else D所以我需要知道谁在子Activity(B这里)检查requestCode
或者换句话说,我想知道B在B中开始的请求代码

你可以通过提出额外的请求代码。

 intent.putExtra("requestCode", requestCode); 

或者,如果您已经多次使用startActivityForResult ,那么比编辑每一个更好,您可以override ActivitystartActivityForResult ,像这样添加代码

 @Override public void startActivityForResult(Intent intent, int requestCode) { intent.putExtra("requestCode", requestCode); super.startActivityForResult(intent, requestCode); } 

所以不需要编辑所有的startActivityForResult
希望它帮助你

请求代码不会自动传递给启动的活动,因为它不(不应该)需要知道这个值。 它只需要知道该做什么,而不是从哪里开始。

开始一个活动实际上只是调用方法的另一种forms。 当你调用一个方法的时候,你会同步地收到结果(就在你拨打电话的地方)。 在这种情况下,你只是传递方法需要的信息来完成它的工作。 你不是在告诉你从哪里来的。

开始一个活动是调用一个方法的asynchronous模拟,在这种情况下,您会在onActivityResult()的特殊方法中获得结果。 在这种方法中,你需要知道你刚刚收到的结果该怎么做,并且你有这个请求代码。

为了说明为什么将请求代码作为parameter passing并不是一个好主意,请考虑显示您可以购买的产品的示例活动。 在这个活动中,有两个button标记为“买”和“login”(因为您目前没有login)。 按“login”将启动名为“login”的活动,该活动将尝试使用提供的信息login用户。 按“购买”将首先启动相同的“login”活动,如果login成功,则开始购买活动。

现在,“login”button使用请求代码1来启动login活动,但“购买”button不能使用相同的请求代码,因为如果login成功,它将不得不做不同的事情。 所以,“购买”button使用请求代码2。

在“login”活动中,您可能会收到两个不同的请求代码,具体取决于它们的调用位置,但您需要执行相同的过程。

因此,如果您将请求代码作为参数传入,那么您最终将得到的代码需要为几个不同的请求代码执行相同的操作,如:

 if (requestCode == LOGIN || requestCode == BUY) { // ... } else ... 

您还将最终将请求代码常量存储在一个中心位置,例如名为RequestCodes的类。

简而言之,请求代码只能用来决定如何处理收到的结果。 这样你将最终得到一个更模块化,更容易维护和更容易扩展的代码。

我结束了使用自定义意图行动传递这种信息到启动活动。

 protected static final String ACTION_DO_C = "do_c"; protected static final String ACTION_DO_D = "do_d"; 

那么你会喜欢:

 final Intent intent = new Intent(this,B.class) intent.setAction(ACTION_DO_C); startActivityForResult(intent,ONE); 

在活动B您可以轻松获得操作:

 getIntent().getAction();