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

km0tfn4u  于 2023-01-28  发布在  Android
关注(0)|答案(4)|浏览(181)

我有四个活动,比如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。也就是说,如果一个需要启动C,否则D。
因此,我需要知道如何检查子Activity(此处为B)中的requestCode。
换句话说,我想获取启动Activity B的请求代码。

whhtz7ly

whhtz7ly1#

您可以通过放置额外的请求代码。

intent.putExtra("requestCode", requestCode);

或者,如果您已经多次使用startActivityForResult,那么比编辑每个startActivityForResult更好的是,您可以在Activity中使用overridestartActivityForResult,并在那里添加代码,如下所示

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

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

jrcvhitl

jrcvhitl2#

请求代码不会自动传递给已启动的Activity,因为它不需要(也不应该)知道这个值。它只需要知道要做什么,而不需要知道它是从哪里启动的。
启动一个活动实际上只是调用一个方法的另一种形式。当你调用一个方法时,你会同步地接收结果(就在你调用的地方)。在这种情况下,你只是传递了方法工作所需的信息。你并没有告诉它你是从哪里调用它的。
启动Activity是调用方法的异步模拟,在这种情况下,您将在特殊方法onActivityResult()中接收结果。在此方法中,您需要知道如何处理刚刚接收到的结果,并且您有此操作的请求代码。
为了更清楚地说明为什么将请求代码作为参数传递不是一个好主意,考虑一个展示你可以购买的产品的示例活动。2在这个活动上有两个按钮,分别标为“购买”和“登录”(因为您当前尚未登录)。按“登录”将启动名为“登录”的活动,该活动将尝试使用提供的信息登录用户。按“购买”将首先启动完全相同的“登录”活动,如果登录成功,则启动购买活动。
现在,“登录”按钮使用请求代码1来启动登录活动,但“购买”按钮不能使用相同的请求代码,因为如果登录成功,它将不得不执行不同的操作。因此,“购买”按钮使用请求代码2。
在“登录”活动中,您可能会收到两个不同的请求代码,具体取决于调用它的位置,但您需要执行完全相同的过程。
因此,如果您将请求代码作为参数传入,您将得到需要为几个不同的请求代码执行相同操作的代码,例如:

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

最后,您还需要将请求代码常量存储在一个中心位置,例如一个名为RequestCodes的类。
简而言之,请求代码应该只用于决定如何处理接收到的结果,这样你将得到一个更模块化、更易于维护和扩展的代码。

wtlkbnrh

wtlkbnrh3#

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

p1tboqfb4#

您可以使用getCallingActivity()来获取启动当前Activity的Activity,该Activity将接收结果值,并在末尾显示响应代码。

相关问题