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

Jit*_*hin 81 android android-intent android-activity startactivityforresult

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

startActivityForResult(new Intent(this,B.class),ONE);
Run Code Online (Sandbox Code Playgroud)

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

 startActivityForResult(new Intent(this,B.class),TWO);
Run Code Online (Sandbox Code Playgroud)

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

Lab*_*lan 127

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

intent.putExtra("requestCode", requestCode);   
Run Code Online (Sandbox Code Playgroud)

或者,如果你已经使用startActivityForResult了很多次,然后比编辑每个更好,你可以overridestartActivityForResult你的Activity,有添加你这样的代码

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }
Run Code Online (Sandbox Code Playgroud)

所以没有必要编辑你的所有startActivityForResult
希望它能帮助你

  • 儿童活动真的没办法获取其请求代码吗? (47认同)
  • 想知道同样的事情 - 这是Android API中没有任何逻辑意义的事情之一. (17认同)
  • Android抱怨#11. (5认同)
  • startActivityForResult可用于启动其他应用程序中的活动,requestCode是您应用程序的私事.从这个角度来看,有意义的是Intent没有这样的方法,正确的方法是setAction建议你想要Activity做什么. (5认同)

Sza*_*ecz 25

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

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

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

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

现在,"登录"按钮使用请求代码1来启动登录活动,但"购买"按钮不能使用相同的请求代码,因为如果登录成功则必须执行不同的操作.因此,"购买"按钮使用请求代码2.

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

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

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...
Run Code Online (Sandbox Code Playgroud)

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

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

  • Szabolcs即使"不需要知道此值",子活动也可能需要将值传递给链中的下一个活动.具有讽刺意味的是,我们需要为此编写更多冗余代码.对于我们不需要知道的事情,我们可以通过更多的讲座来了解我们不应该做什么. (2认同)

Mar*_*Bro 7

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

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";
Run Code Online (Sandbox Code Playgroud)

那你就像:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);
Run Code Online (Sandbox Code Playgroud)

在Activity中,B您可以轻松获得操作:

getIntent().getAction();
Run Code Online (Sandbox Code Playgroud)