Android:OnActivityResult 行为

Android: OnActivityResult behavior

我在我的应用程序中使用 startActivityForResult。但我对它的行为有一些 doubts/queries 的看法。

场景: 在我的应用程序中。我有两个活动,比如 Activity1 和 Activity2。我用不同的请求代码从 Activity1 到 Activity2 两次调用 startActivityForResult

final REQUEST_CODE_1 = 1;
final REQUEST_CODE_2 = 2;

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, REQUEST_CODE_1);

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, REQUEST_CODE_2);

然后我在 onActivityResult

中取回数据
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null) {
        switch (requestCode) {
            case REQUEST_CODE_1:
                //some piece of code
                break;
            case REQUEST_CODE_2:
                //some piece of code
                break;
        }
    }

}

而在我的 Activity2 中,我有一些条件可以根据它发回数据 至 Activity1.

myStr = scanner.getValue();
if(myStr.startsWith("5901")){
     intent.putExtra("box",myStr);
     setResult(REQUEST_CODE_1,intent);
  }else{
      intent.putExtra("item",myStr+"dCbA");
      setResult(REQUEST_CODE_2,intent);
}

其中 mystr 是一个字符串变量。

问题: 从 Activity1,我执行第一个代码,即使用 REQUEST_CODE_1,在我的 Activity2 中,else 块被执行。在这种情况下,我希望 REQUEST_CODE_2 回到 Activity,但相反,我得到 REQUEST_CODE_1 回到 Activity。显然,else 块的 setResult 没有按预期执行。

我希望我的问题很清楚。 有人可以解释一下吗。

谢谢。

据我所知,您认为 myStr 是从 Activity1 发送的 request_code。

request_code 不是参数的一部分,因此您需要将其添加到 Intent 中。

Intent i = new Intent(this, Activity2.class);
i.putExtra("request_code", REQUEST_CODE_1);
startActivityForResult(i, REQUEST_CODE_1);

因此您可以使用 getArguments().getIntegerExtra("request_code")从 Activity2 获取它

在这种情况下,您需要将对象与另一个不带等号(或包装器)的文字进行比较

此外,Activity2 不需要知道 setResult 的整数,因为它需要是 RESULT_OK、RESULT_CANCELED、RESULT_NONE 之一。 onActivityResult 将收到(requestCode、resultCode、data),其中 requestCode 将恰好是您在 startActivityForResult 中输入的整数,resultCode 将是完成前在 Activity2 中设置的那个。

setResult(int) 必须始终提供结果代码,可以是标准结果 RESULT_CANCELED、RESULT_OK。您提供的是请求代码,而不是 RESULT_OK 或 RESULT_CANCELED.

试试这个

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, REQUEST_CODE_1);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null) {
        switch (requestCode) {
            case REQUEST_CODE_1:
                //check if resultCode is RESULT_OK or CANCELED
                break;
            case REQUEST_CODE_2:
                //some piece of code
                break;
        }
    }

}


if(myStr.startsWith("5901")){
     setResult(RESULT_OK,intent);
  }else{
      setResult(RESLT_CANCELED,intent);
}