Жизненный цикл компонентов
Опишите жизненный цикл (ЖЦ) активити и фрагмента. В чем их отличие? Что инициализируется раньше?
Activity и Fragment имеют этапы создания, запуска, возобновления, остановки и уничтожения. Состояние Fragment ограничено состоянием хоста и FragmentManager. У представления Fragment отдельный жизненный цикл: View может быть уничтожена раньше самого Fragment. При обычном создании Activity начинает инициализацию хоста, затем создаются и подключаются фрагменты; точный порядок зависит от восстановления состояния и способа добавления.
🔗 Ссылки для скачивания
Можно ли заставить сервис работать постоянно?
Гарантировать непрерывную работу сервиса нельзя. Foreground service выполняет заметную пользователю работу с уведомлением, но система или пользователь могут его остановить. Действуют ограничения запуска и времени работы для отдельных типов сервисов. Для отложенных устойчивых задач применяют подходящий механизм планирования, например WorkManager.
🔗 Ссылки для скачивания
Объясните жизненный цикл Activity в Android.
Жизненный цикл Activity включает следующие основные методы:
-
onCreate(): Вызывается при создании Activity. Здесь происходит начальная настройка, такая как создание интерфейса. -
onStart(): Вызывается, когда Activity становится видимой для пользователя. -
onResume(): Вызывается, когда Activity начинает взаимодействовать с пользователем. -
onPause(): Вызывается, когда приложение теряет фокус, но еще видно. -
onStop(): Вызывается, когда Activity больше не видно пользователю. -
onDestroy(): Вызывается перед уничтожением Activity. -
onRestart(): Вызывается перед повторным запуском Activity из состояния остановки.
🔗 Ссылки для скачивания
Какой метод вызывается при повороте экрана и как с этим справляться?
По умолчанию изменение конфигурации, например поворот экрана, пересоздаёт Activity. Если соответствующие изменения объявлены в android:configChanges, система вызывает onConfigurationChanged() вместо пересоздания. Одного переопределения метода недостаточно.
Чтобы сохранить данные при повороте экрана:
-
Сохранение состояния в
Bundle:override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("key", "value") } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState != null) { val value = savedInstanceState.getString("key") } } -
Использование
ViewModel:ViewModelсохраняет данные при изменении конфигурации.class MyViewModel : ViewModel() { val data: MutableLiveData<String> = MutableLiveData() } class MainActivity : AppCompatActivity() { private val viewModel: MyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel.data.observe(this, Observer { // Обновление UI }) } }
🔗 Ссылки для скачивания
Как работать с жизненным циклом Fragment в Android?
Фрагменты имеют собственный жизненный цикл, синхронизированный с жизненным циклом Activity:
-
onAttach(): Фрагмент присоединен к Activity. -
onCreate(): Создание фрагмента. -
onCreateView(): Создание представления фрагмента. -
onActivityCreated(): Метод вызывается, когда Activity и фрагмент созданы. -
onStart(): Фрагмент становится видимым. -
onResume(): Фрагмент начинает взаимодействовать с пользователем. -
onPause(): Фрагмент теряет фокус, но еще виден. -
onStop(): Фрагмент больше не виден. -
onDestroyView(): Удаление представления фрагмента. -
onDestroy(): Удаление фрагмента. -
onDetach(): Фрагмент отсоединен от Activity.
🔗 Ссылки для скачивания
Как управлять состоянием компонентов при изменении конфигурации устройства?
Для управления состоянием компонентов при изменении конфигурации устройства можно использовать:
-
ViewModel:ViewModelсохраняет состояние данных при изменении конфигурации.class MyViewModel : ViewModel() { val data: MutableLiveData<String> = MutableLiveData() } class MainActivity : AppCompatActivity() { private val viewModel: MyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel.data.observe(this, Observer { // Обновление UI }) } } -
onSaveInstanceState()иonRestoreInstanceState(): Сохранение и восстановление состояния через Bundle.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("key", "value") } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) val value = savedInstanceState.getString("key") } -
Устаревший способ: retainInstance у Fragment. Для сохранения данных используйте ViewModel, а для восстановления после завершения процесса также SavedStateHandle или сохранённое состояние. Пример ниже приведён только для понимания старого кода.
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) retainInstance = true } }