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

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

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

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

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

Ответ 1

Из вашей 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 no result
        }
    }
}//onActivityResult

Ответ 2

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

Вам нужно переопределить Activity.onActivityResult(), затем проверить его параметры:

  • requestCode определяет, какое приложение вернуло эти результаты. Это определяется вами при вызове startActivityForResult().
  • resultCode сообщает, удалось ли это приложение, не удалось или что-то другое
  • data хранит любую информацию, возвращаемую этим приложением. Это может быть null.

Ответ 3

Дополняя ответ от @Nishant, лучший способ вернуть результат деятельности:

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

У меня возникла проблема с

new Intent();

Затем я узнал, что правильный способ заключается в использовании

getIntent();

чтобы получить текущее намерение

Ответ 4

пример

Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. См. Мой более полный ответ для более подробного объяснения.

enter image description here

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

Ответ 5

Если вы хотите обновить пользовательский интерфейс с результатом деятельности, вы не сможете использовать 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;
    }
}

Это кажется глупым, но работает очень хорошо.

Ответ 6

Для тех, у кого проблема с неправильным кодом запроса в onActivityResult

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

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

Изменить:

startActivityForResult(intent, 1); To:

getActivity().startActivityForResult(intent, 1);

Ответ 7

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

Ответ 8

Очень распространенная проблема в Android
Это может быть разбито на 3 части
1) начать упражнение B (происходит в упражнении A)
2) Установите запрошенные данные (происходит в действии B)
3) Получить запрошенные данные (происходит в действии А)

1) начало деятельности B

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

2) Установите запрашиваемые данные

В этой части вы решаете, хотите ли вы отправлять данные обратно или нет, когда происходит определенное событие.
Например: в действии B есть 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 
}
}

Ответ 9

Правитель @Нишант прав. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установило эту строку в манифесте Android.

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

Если да, удалите android:parentActivityName=".FirstActivity"