Android:OnActivityResult行为

时间:2018-02-07 18:42:26

标签: android android-studio android-intent android-activity startactivityforresult

我在我的应用程序中使用startActivityForResult。但我对它的行为有一些疑问/疑问。

场景:在我的应用中。我有两个活动,比如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是一个String变量。

问题:从Activity1,我执行第一个代码,即REQUEST_CODE_1,在我的Activity2中,执行else块。在这种情况下,我希望REQUEST_CODE_2回到Activity,但我会将REQUEST_CODE_1恢复为Activity。显然,setResult块的else没有按预期执行。

我希望我的问题很明确。 有人可以解释一下。

谢谢。

2 个答案:

答案 0 :(得分:1)

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);
}

答案 1 :(得分:0)

从我看来,你认为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()从Activity2中获取它.getIntegerExtra(“request_code”)

在这种情况下,你需要将对象与另一个没有equals(或包装器)的文字进行比较

此外,Activity2不需要知道setResult的整数,因为它需要是RESULT_OK,RESULT_CANCELED,RESULT_NONE之一。 onActivityResult将接收回(requestCode,resultCode,data),其中requestCode将完全是你执行startActivityForResult的整数,resultCode将是在完成之前在Activity2中设置的那个。