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


85

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

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

在其他情况下,我将与其他情况一起发生。喜欢

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

在B中,我需要根据requestCode调用C或D。即如果一个人需要启动C否则D。
因此,我需要知道如何检查子Activity(此处为B)中的requestCode。
换句话说,我想获取活动B的开始请求代码。

Answers:


137

您可以通过放置多余的内容来传递请求代码。

intent.putExtra("requestCode", requestCode);   

或者,如果您已使用过startActivityForResult多次,则比每次编辑都要好,您可以overridestartActivityForResultActivity添加,就像这样

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

因此,无需编辑所有的startActivityForResult
希望对您有所帮助


49
子活动是否真的没有办法获取其请求代码?
i_am_jorf 2011年

1
到现在为止,我认为别无选择。
Labeeb Panampullan

17
想知道同一件事-这是Android API中没有逻辑意义的事情之一。
Artem Russakovskii 2011年

7
startActivityForResult可用于启动其他应用程序中的活动,requestCode是您应用程序的私事。因此,Intent没有这种方法,而正确的方法是setAction来建议您要Activity进行的操作。
Maciej Beimcik

27

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

开始活动实际上只是调用方法的另一种形式。调用方法时,您会同步收到结果(在调用的位置)。在这种情况下,您仅传递方法需要完成其工作的信息。您没有告诉它从何处调用它。

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

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

现在,“登录”按钮使用请求代码1来启动登录活动,但是“购买”按钮不能使用相同的请求代码,因为如果成功登录,它将必须执行其他操作。因此,“购买”按钮使用请求代码2。

在“登录”活动中,根据从何处调用,您可能会收到两个不同的请求代码,但是您将需要执行相同的过程。

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

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

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

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


1
如果它是某种“经理”,并且您希望输入请求代码来“保存”某个值(该值保存在附加项中),该怎么办?另一个将“检索”值(并返回附加值)的请求代码,但在此活动中,它们还可以总体上管理已保存的值,例如重命名,编辑,删除等。您对此有何想法?我认为这将防止重复执行相同操作的代码/活动。
JRomero '04年

@ J.Romero不要那样做,只会使事情复杂化。只需将该功能放在(实用程序/单个)类中即可。您可能还想看看HandlerService
Szabolcs Berecz

3
Szabolcs子活动即使“不需要知道此值”也可能需要将该值传递给链中的下一个活动。具有讽刺意味的是,我们需要为此编写更多的冗余代码。对于一些我们不需要了解的知识,因为我们可以获得更多的讲座来了解我们不应该做什么。
user250343

我看不出这如何说明为什么子活动应被拒绝访问请求代码。我什至不知道为什么在您的特定示例中需要访问请求代码,考虑到立即购买和登录调用仍然是两个单独的活动。
Drazen Bjelovuk 2014年

1
@EvanR。也许更好的架构是将“主”项目活动细分为单独的添加/编辑活动。因此,代码的重用最少,但是每个活动都可以独立调用。
丹恩·鲍威尔

11

我最终使用自定义的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();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.