67

我有四个活动,说A,B,C和D. 我的情况是一个将被startActivityForResult开始活动B。使用startActivityForResult,如何获取子活动中的requestCode?

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

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

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

在B,我需要调用C或D取决于requestCode。即如果需要启动C D.其他
所以我需要知道如何(这里B)检查在孩子活动的requestCode。
换句话说,我想获取活动B开始的请求代码。

回答

109

你可以把多余的传递请求的代码。

intent.putExtra("requestCode", requestCode); 

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

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

所以没有必要编辑您的所有startActivityForResult
希望它对您有所帮助

+33

难道真的没有办法了孩子的活动,以获取其请求码? – 2011-06-23 00:33:42

+1

直到现在我对最好的知识,我认为没有其他办法。 – 2011-06-23 04:30:57

+11

想知道同样的事情 - 这是Android API中那些没有任何逻辑意义的东西之一。 – 2011-07-29 21:34:50

22

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

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

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

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

现在,“登录”按钮使用请求码1,启动登录活动,但“购买”按钮不能使用相同的请求的代码,因为它会做不同的事情,如果登录成功。所以,“购买”按钮使用请求代码2.

在不同的地方它是从叫您可能会收到两个不同的请求代码“登录”的活动,但你需要做的非常相同的程序。

所以,如果你在请求代码作为参数传递,你将最终需要做同样的东西了几个不同的请求代码,如代码:

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

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

简而言之,请求代码只能用于决定如何处理收到的结果。通过这种方式,您将获得更多模块化,更易于维护和更容易扩展的代码。

+1

如果它是一种“经理”,你想要一个请求代码来“保存”一个特定的值(以额外值保存的值),该怎么办?另一个请求代码可以“检索”一个值(并返回额外值),但在此活动中,他们还可以全面管理保存的值,如重命名,编辑,删除等。对于类似的东西,您有什么想法?我认为这将防止重复代码/活动来执行相同的操作。 – JRomero 2012-04-08 22:20:58

+0

@ J.Romero不要这样做,它会让事情变得复杂。只需将该功能置于(实用程序/单例)类中即可。你可能还想看看[Handler](http://developer.android.com/reference/android/os/Handler.html)和[Service](http://developer.android.com/reference/android/ app/Service.html) – 2012-04-12 09:38:41

+2

Szabolcs即使“不需要知道该值”的子活动也可能需要将该值传递给链中的下一个活动。具有讽刺意味的是,我们需要为此编写更多的冗余代码。对于我们不需要知道的事情,我们可以通过阅读更多讲座来了解我们不应该做什么。 – user250343 2013-03-08 04:22:54

4

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

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(); 
相关问题