Используя startActivityForResult, как получить requestCode в дочерней активности?


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

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

в другой ситуации я б в другой ситуации. как

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

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

3 71

3 ответа:

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

intent.putExtra("requestCode", requestCode);   

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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