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

时间:2011-02-24 11:53:05

标签: android android-intent android-activity startactivityforresult

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

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

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

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

在B中,我需要根据requestCode调用C或D.即如果ONE需要启动C else D.
所以我需要知道如何检查子Activity中的requestCode(这里是B) 换句话说,我想获得活动B开始的请求代码。

4 个答案:

答案 0 :(得分:122)

您可以通过put extra传递请求代码。

intent.putExtra("requestCode", requestCode);   

或者,如果您多次使用startActivityForResult,那么比编辑每个override更好,您可以startActivityForResult Activity中的@Override public void startActivityForResult(Intent intent, int requestCode) { intent.putExtra("requestCode", requestCode); super.startActivityForResult(intent, requestCode); } ,在此处添加代码< / p>

{{1}}

因此无需编辑所有startActivityForResult
希望它能帮到你

答案 1 :(得分:25)

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

启动活动实际上只是调用方法的另一种形式。当您调用方法时,您会同步收到结果(就在您拨打电话的地方)。在这种情况下,您只传递方法需要执行其工作的信息。你没有告诉你从哪里打电话。

启动活动是调用方法的异步模拟,在这种情况下,您将在特殊方法onActivityResult()中接收结果。在这种方法中,您需要知道如何处理刚刚收到的结果,并且您有此请求代码。

为了更清楚一点,为什么将请求代码作为参数传递不是一个好主意,请考虑显示您可以购买的产品的示例活动。在此活动上有两个标记为“购买”和“登录”的按钮(因为您当前未登录)。按“登录”将启动名为“登录”的活动,该活动将尝试使用提供的信息登录用户。按“购买”将首先启动相同的“登录”活动,如果登录成功,则启动购买活动。

现在,“登录”按钮使用请求代码1来启动登录活动,但“购买”按钮不能使用相同的请求代码,因为如果登录成功,它将不得不做一些不同的事情。因此,“购买”按钮使用请求代码2。

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

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

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

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

简而言之,请求代码只应用于决定如何处理收到的结果。这样,您最终将获得更模块化,更易于维护且更易于扩展的代码。

答案 2 :(得分:7)

我最终使用自定义Intent操作将此类信息传递给启动Activity。

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();

答案 3 :(得分:0)

您可以使用getCallingActivity()获取开始当前活动的活动,该活动将在结尾处收到带有响应代码的结果值。