Я потратил несколько часов, пытаясь воссоздать вашу ситуацию по разным сценариям. Прежде всего, я должен отметить, что жизненный цикл фрагментов на самом деле настолько сложен, что во время ввода-вывода Google 2018 один из ведущих разработчиков спросил аудиторию, вызывается ли сначала метод onCreate()
из Activity
или что из Fragment
х. Ответ был таков, это зависит от версии SDK. Но они все больше внимания уделяют библиотекам совместимости и советуют разработчикам использовать их для универсального использования на разных устройствах, а также наслаждаться новыми API-интерфейсами, которые сделают работу с фрагментами намного проще для нас.
Просматривая документацию по классу AppCompatActivity , я понял, что такое поведение является способом обращения с фрагментами.
Protected methods
void onCreate(Bundle savedInstanceState)
Perform initialization of all fragments.
void onDestroy()
Destroy all fragments.
void onPostCreate(Bundle savedInstanceState)
void onPostResume()
Dispatch onResume() to fragments.
void onSaveInstanceState(Bundle outState)
Save all appropriate fragment state.
void onStart()
Dispatch onStart() to all fragments.
void onStop()
Dispatch onStop() to all fragments.
Как вы можете видеть, они "сохраняют все соответствующие состояния фрагмента" в onSaveInstanceState()
; Это означает, что состояния будут восстановлены позже, после того, как Activity
будет разрушен и воссоздан. Таким образом, в onDestroy()
все фрагменты уничтожаются, и когда Activity
создается снова, они также воссоздаются. Чтобы убедиться, что вы можете переопределить эти методы внутри Fragment
и Activity
и проверить результат. Если вы не проверяете FragmentManager
для уже прикрепленных фрагментов, метод onCreate()
метода Fragment
будет вызываться дважды, один раз напрямую - добавляя как новый Fragment
- и один раз самим AppCompatActivity
.
О retainInstance = true
в документации говорится, что он сохраняет переменные-члены во время изменений конфигурации и приведет к небольшому различию в жизненном цикле Fragment
.