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

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

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

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

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

9 ответов


из своего 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();

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


пример

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

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

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

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


для тех, у кого есть проблемы с неверный requestCode в onActivityResult

если вы звоните startActivityForResult() из своего Fragment, requestCode изменяется действием, которому принадлежит фрагмент.

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

изменения:

startActivityForResult(intent, 1); в:

getActivity().startActivityForResult(intent, 1);


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


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

1) startActivity B

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

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

в этой части вы решаете, хотите ли вы отправить данные обратно или нет, когда происходит определенное событие.
Например: в activity B есть EditText и две кнопки b1, b2.
Нажатие на кнопку b1 отправляет данные обратно в actvity a
Нажатие на кнопку b2 не отправляет никаких данных.

передача данных

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

не обменивались данными!--7-->

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

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

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

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