Используя startActivityForResult, как получить requestCode в дочерней активности? - PullRequest
76 голосов
/ 24 февраля 2011

У меня есть четыре вида деятельности, скажем, A, B, C и D. В моей ситуации A запустит действие B с помощью startActivityForResult.

startActivityForResult(new Intent(this,B.class),ONE);

В другой ситуации я буду B с другой ситуацией. как

 startActivityForResult(new Intent(this,B.class),TWO);

В B мне нужно вызывать C или D в зависимости от requestCode. Т.е. если ОДНО нужно запустить C, то еще D.
Поэтому мне нужно знать, как проверить код запроса в дочернем Activity (B здесь).
Другими словами, я хочу получить код запроса, с которого было начато действие B.

Ответы [ 4 ]

124 голосов
/ 24 февраля 2011

Вы можете передать код запроса, поставив доп.

intent.putExtra("requestCode", requestCode);   

Или, если вы использовали startActivityForResult много раз, то лучше, чем редактировать каждый, вы можете override startActivityForResult в вашем Activity, добавить туда свой код, например

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

Так что нет необходимости редактировать все ваши startActivityForResult
Надеюсь, это помогло вам

25 голосов
/ 04 октября 2011

Код запроса не передается в запущенное действие автоматически, потому что ему не нужно (и не должно) знать это значение.Нужно только знать, что делать, а не откуда это началось.

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

Запуск действия является асинхронным аналогом вызова метода, и в этом случае вы получаете результат в специальном методе onActivityResult ().В этом методе вам нужно знать, что делать с только что полученным результатом, и у вас есть код запроса для этого.

Чтобы было немного понятнее, почему не стоит передавать запроскод в качестве параметра, рассмотрим пример деятельности, которая показывает продукт, который вы можете купить.В этом упражнении есть две кнопки с надписью «Купить» и «Войти» (так как вы в данный момент не вошли в систему).Нажатие «Логин» запустит действие с именем «Логин», которое попытается войти в систему, используя предоставленную информацию.Нажатие «Купить» сначала запустит ту же самую операцию «Вход в систему», и, если вход был успешным, запустите действие покупки.

Теперь кнопка «Вход» использует код запроса 1 для запуска действия входа, нокнопка «Купить» не может использовать тот же код запроса, поскольку в случае успешного входа она должна будет выполнить что-то другое.Таким образом, кнопка «Купить» использует код запроса 2.

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

Таким образом, если вы передадите код запроса в качестве параметра, вы получите код, который должен выполнять те же действия для пары разных кодов запроса, например:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

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

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

7 голосов
/ 30 июня 2015

В итоге я использовал пользовательское действие Intent для передачи такого рода информации запускающему Activity.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

Тогда вы пойдете так:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

А в действии B вы легко получите действие:

getIntent().getAction();
0 голосов
/ 21 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...