Несколько лет назад у меня возникла проблема в одном из моих приложений, когда я попытался зафиксировать FragmentTransaction
внутри моего обратного вызова onActivityResult()
. Погуляв вокруг, я нашел этот вопрос и ответ, в котором говорится
В момент вызова
onActivityResult()
состояние активности/фрагмента может быть еще не восстановлено, и поэтому любые транзакции, которые происходят в течение этого времени, будут потеряны в результате.
Я закончил адаптировать решение, рекомендованное в том же ответе для моего приложения, и жизнь была хорошей. Однако недавние эксперименты показывают, что, возможно, все изменилось, и теперь может безопасно совершать FragmentTransaction
изнутри onActivityResult()
.
Документация для (поддержка v4) FragmentManager.beginTransaction()
определяет безопасное окно для транзакций как:
Примечание: транзакция фрагмента может быть создана/зафиксирована только до того, как операция сохранит свое состояние. Если вы попытаетесь совершить транзакцию после
FragmentActivity.onSaveInstanceState()
(и до следующегоFragmentActivity.onStart
илиFragmentActivity.onResume()
, вы получите сообщение об ошибке.
Чтение документации для onActivityResult()
, я вижу
Вы получите этот вызов непосредственно перед
onResume()
при повторном запуске вашей активности.
Это заставляет меня думать, что безопасно выполнять эти транзакции в onActivityResult()
, поскольку onStart()
уже вызван, помещая меня в безопасное окно.
Я сделал приложение, чтобы проверить это, и я успешно вижу фрагменты диалога, которые я создаю и фиксирую внутри onActivityResult()
. У меня было одно и то же приложение, которое также регистрировало обратные вызовы жизненного цикла активности, чтобы я мог проверить их порядок, и я вижу onStart()
, затем onRestoreInstanceState()
, а затем onActivityResult()
каждый раз.
Я что-то упустил? Или изменилась структура и onActivityResult()
теперь гарантированно станет безопасным местом для транзакций с фрагментами? Различается ли это поведение по уровню API?
Я нашел еще один вопрос и ответ, который, похоже, читает документацию так же, как и у меня, но оба они старше года, и ни один из них не относится к onActivityResult()
как безопасное место для транзакций.