4. Получение результата работы Activity

Важнейшей возможностью при открытии другого Activity является возможность получить результат работы этого Activity. Такая возможность часто бывает полезна при открытии Activity из своего же приложения, но наиболее часто это используется при открытии Activity другого приложения.

Например, вы можете открыть окно для получения снимка из камеры телефона, после чего получить результат работу этого окна в виде сделанной фотографии. Или, например, вы можете подключить к своему проекту стороннюю библиотеку, в которой определен уже готовый Activity, добавить его в манифест, вызвать и получить результат его работы.

Давайте рассмотрим пример с получением результатов работы окна.

Пример вызова другого Activity для получения результата

Создадим приложение с двумя Activity. Первое Activity вызывает второе, во втором пользователь вводит какие-то данные, которые передаются обратно в первое Activity. Макеты для двух окон выглядит следующим образом

1. Открытие Activity для получения результата

Для начала напишем обработчик нажатия для кнопки в первой Activity

MainActivity.java
public class MainActivity extends AppCompatActivity {

    public static int REQUEST_CODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> {
            Intent intent = new Intent(this, SecondActivity.class);
            startActivityForResult(intent, REQUEST_CODE);
        });
    }
}

Для того чтобы открыть Activity для получения результата используем метод контекста startActivityForResult(). Первый параметр - явное намерение для открытия SecondActivity, второй параметр называется requestCode и является целым числом.

Назначение этого параметра очень простое – так как логика нашего приложения может быть очень сложной, то мы из одного окна можем теоретические открыть несколько других окон и получить из них результат

Как же нам потом узнать, из какого окна пришел результат? Для этого, при вызове метода startActivityForResult() мы передаем не только намерение, но и целое число, код для окна, который он нам вернет обратно. Мы считаем этот код, поймем – из какого окна пришел результат и обработаем результат соответствующим образом.

2. Возврат результата из второго Activity

Теперь займемся кодом для SecondActivity. Наша задача состоит в том, чтобы считать введенное значение и передать его как результат работы Activity.

SecondActivity.java
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        EditText et = findViewById(R.id.editText);
        
        Button button = findViewById(R.id.button);
        button.setOnClickListener(v -> {
            // Считываем значение поля
            String text = et.getText().toString();

            // Формируем "пустое" намерение
            Intent intent = new Intent();
            // Добавляем в намерение данные
            intent.putExtra("result",text);
            
            // Устанавливаем результат
            setResult(RESULT_OK,intent);
            
            // Закрываем Activity
            finish();
        });
    }
}

Таким образом, для того, чтобы вернуть результат работы Activity, мы создаем «пустой» Intent, то есть вызываем конструктор без параметров, не указывая контекст и адресата. В Intent мы помещаем наши данные, которые хотим вернуть, после чего вызываем метод setResult() куда передаем наш сконструированный Intent.

Обратите внимание, что в качестве первого параметра метода setResult() мы передаем некий result code (не путайте с request code!). Код результата позволяет нам сообщить в первый Activity – закончилась ли работа второго Activity успешно, или пользователь отменил операцию, и работа второго Activity была отменена.

Параметра Result Сode представляет собой обычную целочисленную константу. Изначально предусмотрены три стандартные константы:

  • RESULT_CANCELED (равно 0);

  • RESULT_OK (равно -1);

  • RESULT_FIRST_USER (равно 1) – обозначает первый «пользовательский» результат.

Помимо стандартных констант, вы можете использовать любое другое целое число.

Использовать собственные коды результата рекомендуется только тогда, когда уверены, что сторонние программы не будут вызывать ваш Activity. Если же вам необходимо использовать свои константы в любом случае, указывайте это в сопроводительной документации к вашему коду.

Для примера использования кода RESULT_CANCELED запрограммируем SecondActivity так, чтобы оно возвращало RESULT_CANCELED если пользователь нажал на устройстве кнопку «Назад». Для этого переопределим метод onBackPressed()

SecondActivity.java
@Override
public void onBackPressed() {
    super.onBackPressed();
    
    setResult(RESULT_CANCELED);
}

Обратите внимание, что в этом случае мы используем перегруженный метод setResult() всего с одним параметром. Это обусловлено, что в этом случае мы не передаем никаких данных - важен сам факт отмены операции. В таком случае создавать Intent не нужно.

3. Обработка результата в первом Activity

Теперь вернемся в MainActivity и обработаем результат, который пришел из SecondActivity

MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Пользователь вышел из SecondActivity", Toast.LENGTH_SHORT).show();
        } else if (resultCode == RESULT_OK) {

            if (data != null) {
                String text = data.getStringExtra("result");
                if (text != null) {
                    TextView tv = findViewById(R.id.textView);
                    tv.setText(text);
                }
            }
        }
    }
}

Для того чтобы обработать результат, переопределим метод onActivityResult(). Метод содержит три аргумента:

  • requestCode - код, который мы передавали при вызове метода startActivityForResult();

  • resultCode - код результата, который мы указывали в методе setResult();

  • Intent - намерение с данными (если мы вызывали метод setResult() без параметра Intent, то он будет равен null).

Сначала мы проверяем код, чтобы убедиться что результат пришел из SecondActivity, далее мы проверяем код результата и прописываем логику работы метода в зависимости от того, успешно ли закрылось SecondActivity. Далее мы делаем еще несколько проверок на наличие объекта Intent и на наличие данных внутри намерения.

Запускаем приложение, в первом случае вернемся с помощью кнопки "Назад", во втором случае укажем какой-то текст и нажмем кнопку для отсылки результата.

Last updated