如何在Android上管理startActivityForResult?

How to manage startActivityForResult on Android?

在我的活动中,我从startActivityForResult的主要活动中调用第二个活动。在我的第二个活动中,有一些方法完成了这个活动(可能没有结果),但是,只有一个方法返回结果。

例如,从主活动中,我调用第二个活动。在这个活动中,我正在检查手机的一些功能,比如它是否有摄像头。如果没有,我将关闭此活动。另外,在准备MediaRecorderMediaPlayer的过程中,如果发生问题,我将关闭此活动。

如果它的设备有一个摄像头,并且录制完全完成,那么在录制视频之后,如果用户单击"完成"按钮,那么我将把结果(录制视频的地址)发送回主活动。

如何检查主要活动的结果?


从你的FirstActivity调用SecondActivity使用startActivityForResult()方法

例如:

1
2
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

在您的SecondActivity中,设置要返回到FirstActivity的数据。如果你不想回来,就不要再做任何设置。

例如:在SecondActivity中,如果要发送回数据:

1
2
3
4
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

如果不想返回数据:

1
2
3
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

现在在您的FirstActivity类中,为onActivityResult()方法编写以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult


How to check the result from the main activity?

您需要覆盖Activity.onActivityResult(),然后检查其参数:

  • requestCode标识返回这些结果的应用程序。这是您在调用startActivityForResult()时定义的。
  • resultCode通知您这个应用程序是成功的、失败的还是其他的
  • data保存此应用程序返回的任何信息。这可能是null


补充@nishant的答案,返回活动结果的最佳方法是:

1
2
3
4
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

我有问题

1
new Intent();

然后我发现正确的方法是

1
getIntent();

获得当前意图


例子

为了在上下文中看到整个过程,这里是一个补充答案。更多解释见我的完整答案。

enter image description here

mainactivity.java(主活动.java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //"Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) { // Activity.RESULT_OK

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

第二活动.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    //"Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}


对于那些在OnActivityResult中有错误请求代码问题的人

如果您从您的Fragment中调用startActivityForResult(),那么请求代码将由拥有该片段的活动更改。

如果要在活动中获得正确的结果代码,请尝试以下操作:

变化:

startActivityForResult(intent, 1);至:

getActivity().startActivityForResult(intent, 1);


如果要用活动结果更新用户界面,则不能使用this.runOnUiThread(new Runnable() {}。这样,用户界面就不会刷新新值。相反,您可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

这看起来很傻,但效果很好。


首先在第一个Activity中使用带参数的startActivityForResult(),如果要将数据从第二个Activity发送到第一个Activity中,然后使用IntentsetResult()方法传递值,并在第一个Activity中获取onActivityResult()方法中的数据。


Android中非常常见的问题它可以分成三部分1)启动活动B(在活动A中发生)2)设置请求的数据(在活动B中发生)3)接收请求的数据(发生在活动A中)

1) startActivity B

1
2
Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Set requested data

在本部分中,您将决定在发生特定事件时是否发送数据。在活动B中有一个编辑文本和两个按钮b1、b2。单击按钮b1将数据发送回活动a单击按钮b2不会发送任何数据。

发送数据

1
2
3
4
5
6
7
b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

不发送数据

1
2
3
4
5
b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

用户单击后退按钮默认情况下,使用activity.result_cancel response code设置结果。

3) Retrieve result

对于该重写OnActivityResult方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
You need to override Activity.onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_CODE_ONE) {


   String a = data.getStringExtra("RESULT_CODE_ONE");

}
else if(resultCode == RESULT_CODE_TWO){

   // b was clicked

}
else{

}
}