提问



在我的Activity中,我通过startActivityForResult从MainActivity中调用第二个Activity。在我的第二个Activity中,有一些方法可以完成此Activity(可能没有结果),但是,只有其中一个返回结果。


例如,从MainActivity我称之为第二个。在这项Activity中,我正在检查手机的某些功能,例如是否有相机。如果它没有,那么我将关闭此Activity。此外,在准备MediaRecorderMediaPlayer期间如果一个问题发生然后我将关闭这个Activity。


如果其设备有摄像头并完全录制,则在用户点击完成按钮后录制视频后,我会将结果(录制视频的地址)发送回MainActivity。


如何查看MainActivity的结果?

最佳参考


FirstActivity中使用startActivityForResult()方法调用SecondActivity


例如:


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


SecondActivity中设置要返回FirstActivity的数据。如果你不想回来,不要设置任何。


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


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


如果您不想返回数据:


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


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


@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

其它参考1



  如何检查MainActivity的结果?



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



  • requestCode确定哪个应用返回了这些结果。当您致电startActivityForResult()时,由您定义。

  • resultCode通知您此应用是成功,失败还是其他不同

  • data保存此应用返回的任何信息。这可能是null


其它参考2


补充@ Nishant的答案,返回Activity结果的最佳方法是:


Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();


我遇到了问题


new Intent();


然后我发现正确的方法是使用


getIntent();


获得当前的意图

其它参考3


示例


要在上下文中查看整个过程,这是一个补充答案。请参阅我的更全面的答案以获得更多解释。





MainActivity.java


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


SecondActivity.java


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

其它参考4


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


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


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

其它参考5


对于那些在onActivityResult 中有错误requestCode问题的人


如果从Fragment调用startActivityForResult(),则requestCode由拥有片段的Activity更改。


如果您想在Activity中获得正确的resultCode,请尝试以下操作:


更改:


startActivityForResult(intent, 1);致:


getActivity().startActivityForResult(intent, 1);

其它参考6


首先使用startActivityForResult()在第一Activity中使用参数,如果要将数据从第二Activity发送到第一Activity,则使用Intent和[[]]传递值setResult()方法并在onActivityResult()方法中获取Activity中的数据。

其它参考7


在android中非常常见的问题
可分为3件

1)启动ActivityB(在ActivityA中发生)

2)设置请求的数据(在ActivityB中发生)

3)接收请求的数据(在ActivityA中发生)



  1)startActivity B.



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



  2)设置请求的数据



在此部分中,您可以决定在特定事件发生时是否要发送数据
例如:在ActivityB中有一个EditText和两个按钮b1,b2。

单击按钮b1将数据发送回动作A

单击按钮b2不会发送任何数据。


发送数据


b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}


不发送数据


b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }


用户点击后退按钮

默认情况下,使用Activity.RESULT_CANCEL响应代码设置结果



  3)回复结果



对于覆盖onActivityResult方法


@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 
}
}

其它参考8


@Nishant的回答是正确的。在我的情况下,由于AndroidManifest中的设置,从未调用过onActivityResult。确保您的第二个Activity(或发件人)没有在Android Manifest中设置此行。


<activity android:name=".SecondViewActivity"
            android:parentActivityName=".FirstActivity"/>


若有,请删除android:parentActivityName=".FirstActivity"