Как управлять «startActivityForResult» на Android?

В своей деятельности я startActivityForResult второе действие из основного startActivityForResult деятельности startActivityForResult . В моем втором действии есть некоторые методы, которые завершают эту деятельность (возможно, без результата), однако только один из них возвращает результат.

Например, из основного действия я вызываю второй. В этом упражнении я проверяю некоторые функции телефона, например, у него есть камера. Если этого не произойдет, я закрою это действие. Кроме того, во время подготовки MediaRecorder или MediaPlayer если проблема возникает, я MediaRecorder это действие.

Если на его устройстве есть камера и запись выполнена полностью, то после записи видео, если пользователь нажимает кнопку «Готово», я отправлю результат (адрес записанного видео) обратно в основное действие.

Как проверить результат из основного вида деятельности?

Solutions Collecting From Web of "Как управлять «startActivityForResult» на Android?"

Из вашего FirstActivity SecondActivity использует startActivityForResult()

Например:

 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) { // 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() {} Выполнение этого пользовательского интерфейса не будет обновляться с новым значением. Вместо этого вы можете сделать это:

 @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

Если вы вызываете startActivityForResult() из вашего Fragment , startActivityForResult() изменяется с помощью Activity, которому принадлежит фрагмент.

Если вы хотите получить правильный результатCode в своей деятельности, попробуйте это:

Изменить:

startActivityForResult(intent, 1); Для того, чтобы:

getActivity().startActivityForResult(intent, 1);

Сначала вы используете startActivityForResult() с параметрами в первом startActivityForResult() и если вы хотите отправить данные из второго Activity в первую Activity то передайте значение с помощью метода Intent с setResult() метода setResult() и получите эти данные внутри onActivityResult() в первом onActivityResult() .