🔥

Тред (Алексей Панов)


Сегодня хотел рассказать о том как менялась Android разработка, как угасали тренды и лучшие практики. Но давайте лучше поговорим про то, как наши деды решали главную проблему мира Android — проблему обработки конфигурации устройства.
notion image

И самым популярным вариантом решения этой проблемы была простая фиксация ориентации устройства, но почему-то многие разработчики до сих пор думают, что этого достаточно…
notion image

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

Следующим способом является самостоятельная обработка конфигурации. Этот способ тоже не является серебряной пулей, вы лишитесь возможности автоматической подмены ресурсов, например для ландшафтной ориентации.
notion image

Но этот механизм может помочь, если вы, например, показываете видео и хотите, чтобы при переходе в ландшафтную ориентацию оно не было приостановлено.

Еще один способ, который все еще остается актуальным — это сохранение состояния с помощью механизма SavedInstanceState. Сейчас напрямую его почти не используют, однако, в случае если необходимо восстановить данные после смерти процесса — это все еще единственный рабочий способ.

И если первые три способа все еще могут быть актуальны даже сейчас, то следующие подходы, которые считались раньше best practices вы уже вряд ли найдете в современных проектах.

Например, можно было сохранять данные с помощью Retain Fragment, у таких фрагментов колбэк onDestroy не вызвался при перевороте экрана, что позволяло сохранять данные. Какое-то время назад даже ранняя версия ViewModel использовала этот механизм для сохранения состояния.

Сейчас же ViewModel для сохранения состояния использует древний механизм lastNonConfigurationInstance. Вы можете даже сейчас легко повторить это поведение, используя кастомную конфигурацию, однако эти методы уже deprecated.
notion image

Ну а еще одним интересным способом решения проблемы являлось использование лоадеров. Вообще Loader, судя по названию, был предназначен для загрузки данных, однако он также мог переживать смерть Activity или Fragment.
notion image

Использование лоадеров ранее считалось рекомендуемым подходом, однако на сегодняшний день вряд ли кто-то из молодых разработчиков вообще о них что-либо слышал. Использовали ли лоадеры вы?
🤔 57.4% Да, было дело
🤔 42.6% Первый раз слышу

Проблему изменения конфигурации все решали как могли, еще одним интересным решением являлся подход в библиотеке Moxy. Там эта проблема решалась с помощью паттерна Команда, повторно проставляя нужный стейт вьюшке.
notion image

Собственно и сейчас с приходом Jetpack Compose и Kotlin Multiplatform мы до конца не избавились от этой проблемы. Кто-то переходит на Redux подход, кто-то создает библиотеки, позволяющие сохранить стейт и при этом переиспользовать код между платформами.

Таким образом мы до сих пор решаем одну и ту же задачу, что была актуальной с самого рождения Android. Со временем подходы меняются, библиотеки устаревают, но одно остается вечным — это умирающая Activity при перевороте экрана!

Алексей ПановАлексей Панов