如何在Android上pipe理`startActivityForResult`?

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

例如,从主要活动中,我称之为第二个活动。 在这个活动中,我正在检查手机的一些function,如它是否有相机。 如果没有,我会closures这个活动。 此外,在准备MediaRecorderMediaPlayer如果发生问题,我将closures此活动。

如果它的设备有一个摄像头,录制完成,那么录制完video后,如果用户点击完成button,我会把结果(录制的video的地址)发回主要活动。

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

SecondActivity使用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 

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

你需要重写Activity.onActivityResult()然后检查它的参数:

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

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

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

我遇到了问题

 new Intent(); 

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

 getIntent(); 

得到目前的意图

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

在这里输入图像描述

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

如果要用活动结果更新用户界面,则不能使用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; } } 

这似乎很愚蠢,但工作得很好。

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

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

如果你想在你的活动中得到正确的resultCode,试试这个:

更改:

startActivityForResult(intent, 1); 至:

getActivity().startActivityForResult(intent, 1);

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