Когда пересоздается Activity?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Краткий ответ
Activity пересоздается при изменении конфигурации устройства (поворот экрана, изменение языка, размера окна в multi-window) и при уничтожении системой в условиях нехватки памяти. Это ключевой механизм жизненного цикла Android, обеспечивающий адаптивность и управление ресурсами.
Подробный разбор причин пересоздания
1. Изменение конфигурации (Configuration Change)
Это наиболее частая причина. Система уничтожает и заново создает Activity, чтобы она могла загрузить подходящие ресурсы (макеты, строки) для новой конфигурации.
Основные триггеры:
- Поворот устройства (смена ориентации
portrait↔landscape). - Изменение языка или региона в настройках системы.
- Подключение/отключение физической клавиатуры.
- Изменение размера окна (переход в/из режима разделенного экрана
multi-window, изменение размера окна вfreeformрежиме). - Изменение плотности пикселей (DPI) (например, при подключении к внешнему дисплею).
- Изменение темы оформления системы (светлая/темная).
Поведение по умолчанию и управление им: При смене конфигурации система по умолчанию вызывает:
onPause(),onStop(),onDestroy()для текущего экземпляра Activity.- Сразу создает новый экземпляр, вызывая
onCreate(),onStart(),onResume().
Чтобы сохранить данные (например, состояние UI или загруженные данные) при этом процессе, используется onSaveInstanceState().
class MyActivity : AppCompatActivity() {
private var userInputText: String = ""
override fun onSaveInstanceState(outState: Bundle) {
// Сохраняем данные перед уничтожением Activity
outState.putString("USER_INPUT_KEY", userInputText)
super.onSaveInstanceState(outState)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
if (savedInstanceState != null) {
// Восстанавливаем данные в новом экземпляре
userInputText = savedInstanceState.getString("USER_INPUT_KEY", "")
editText.setText(userInputText)
}
}
}
2. Уничтожение системой в фоне
Когда приложение находится в фоне, а системе критически не хватает памяти для более приоритетных задач (например, работающего на переднем плане приложения для звонков), система может полностью убить процесс вашего приложения. При возврате пользователя система попытается восстановить Activity «с нуля».
Ключевые отличия от смены конфигурации:
- Процесс убивается, поэтому все переменные в памяти теряются.
- Единственный способ сохранить сложные данные — использовать
onSaveInstanceState()для легковесных данных (например, ID, текст) и постоянное хранилище (Room, DataStore, SharedPreferences) для всего остального. - Восстановление через
onCreate(Bundle?), гдеBundleсодержит данные изonSaveInstanceState().
3. Явный вызов recreate()
Разработчик может программно инициировать пересоздание, например, после смены темы приложения в рантайме.
// Например, при переключении темы
fun onDarkModeSelected() {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
recreate() // Принудительное пересоздание для применения новой темы
}
Как предотвратить пересоздание при смене конфигурации?
Иногда перезагрузка всей Activity из-за поворота экрана избыточна (например, при воспроизведении видео). Для этого в манифесте можно указать android:configChanges.
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize|keyboardHidden" />
После этого при повороте экрана Activity не будет пересоздана, а вместо этого будет вызван callback onConfigurationChanged(), где разработчик может обработать изменения вручную.
⚠️ Важное предупреждение: Этот подход требует ручной обработки всех изменений (например, подгрузки новых макетов). Его следует использовать осознанно, только для специфичных случаев. Стандартный механизм с onSaveInstanceState() чаще всего является правильным и предпочтительным.
Итог
- Главные причины: 1) Изменение конфигурации устройства, 2) Уничтожение фонового процесса системой.
- Основной механизм сохранения состояния:
BundleвonSaveInstanceState(). - Ключевой навык разработчика: Правильно сохранять и восстанавливать состояние UI и данные между пересозданиями, обеспечивая бесшовный пользовательский опыт. Пренебрежение этим ведет к «раздражающим» сбросам введенных данных и негативным отзывам.