Используя startActivityForResult, как получить requestCode в дочерней активности?
У меня есть четыре вида деятельности: A, B, C и D.
Моя ситуация A начнет действие B путем startActivityForResult.
startActivityForResult(new Intent(this,B.class),ONE);
В другой ситуации я буду с другой ситуацией. как
startActivityForResult(new Intent(this,B.class),TWO);
В B мне нужно проверить, что мне нужно вызвать C или D, зависящий от кода запроса. I.ЕЕ, если ОДИН нужно запустить C else D
Поэтому мне нужно знать, кто должен проверить код запроса в дочерней операции (здесь)
Или, другими словами, я хочу получить, с какого кода запроса B начинался с Activity B
Ответы
Ответ 1
Вы можете передать код запроса, добавив дополнительно.
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
Надеюсь, это помогло вам.
Ответ 2
Код запроса не передается в запущенное действие автоматически, потому что ему не нужно (и не должно) знать это значение. Он должен знать только, что делать, а не где он был запущен.
Запуск активности - это просто еще одна форма вызова метода. Когда вы вызываете метод, вы получаете результат синхронно (прямо там, где вы сделали звонок). В этом случае вы только передаете информацию, которую метод должен выполнять. Вы не говорите, откуда вы его вызвали.
Запуск активности - это асинхронный аналог вызова метода, и в этом случае вы получаете результат в специальном методе onActivityResult(). В этом методе вам нужно знать, что делать с полученным вами результатом, и для этого у вас есть код запроса.
Чтобы было немного яснее, почему не рекомендуется передавать код запроса в качестве параметра, рассмотрите пример активности, показывающий продукт, который вы можете купить. В этом действии есть две кнопки с надписью "Купить" и "Войти" (так как вы в настоящее время не вошли в систему). Нажатие "Login" запустит операцию с именем "Login", которая попытается войти в систему пользователем, используя предоставленную информацию. Нажатие "Купить" сначала начнет тот же "вход", и если вход в систему будет успешным, начните операцию покупки.
Теперь кнопка "Войти" использует код запроса 1 для запуска активности входа, но кнопка "Купить" не может использовать один и тот же код запроса, поскольку ему нужно будет сделать что-то другое, если логин будет успешным. Таким образом, кнопка "Купить" использует код запроса 2.
В режиме "Вход" вы можете получить два разных кода запроса в зависимости от того, откуда он был вызван, но вам нужно будет выполнить ту же самую процедуру.
Итак, если вы передадите код запроса в качестве параметра, вы получите код, который должен сделать один и тот же материал для пары разных кодов запросов, например:
if (requestCode == LOGIN || requestCode == BUY) {
// ...
} else ...
В итоге вы также сохраните константы кода запроса в центральном расположении, например. класс с именем RequestCodes.
Короче говоря, код запроса должен использоваться только для того, чтобы решить, что делать с полученным результатом. Таким образом, вы получите более модульный, простой в обслуживании и более простой в расширении код.
Ответ 3
В результате я использовал пользовательское действие "Намерение", чтобы передать эту информацию в запущенную активность.
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();