IT Academy
Справочник курса

Android-разработка

Все объяснения, задачи и лабораторная в одном месте.

Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.

1. Компоненты Android и lifecycle

Объяснение

Activity проходит состояния жизненного цикла и может быть пересоздана. Процесс может быть уничтожен вне контроля приложения. Временное UI-состояние, состояние ViewModel и долговременные данные требуют разных мест хранения.

Задача для самостоятельного решения

Переживёт ли обычное поле Activity поворот экрана?

Показать разбор ответа

Нет, при пересоздании появится новый экземпляр. ViewModel помогает для конфигурационных изменений, а после смерти процесса нужны saved state или постоянное хранилище.

2. Jetpack Compose и state

Объяснение

Compose строит интерфейс из состояния. Recomposition повторно вызывает функции, поэтому побочные эффекты нельзя произвольно выполнять в теле composable. Стабильные ключи связывают элементы списка с их состоянием.

Задача для самостоятельного решения

Почему сетевой запрос в теле composable может повторяться?

Показать разбор ответа

Recomposition запускается многократно. Используйте контролируемый effect или ViewModel и моделируйте loading/success/error явным состоянием.

3. Navigation и adaptive layouts

Объяснение

Навигация должна учитывать back stack и восстановление. Адаптивный layout отвечает на доступный размер окна, а не название устройства. Большой экран может показывать список и детали одновременно.

Задача для самостоятельного решения

Что хранить в аргументах экрана заказа?

Показать разбор ответа

Идентификатор заказа, а не весь изменяемый объект. Экран получает актуальные данные из repository и корректно восстанавливается по маршруту.

4. Coroutines, Room и repository pattern

Объяснение

Repository объединяет источники данных и скрывает их детали. Room предоставляет структурированное локальное хранение. Coroutine scope должен соответствовать времени жизни владельца, чтобы работа не переживала экран случайно.

Задача для самостоятельного решения

Почему suspend-функция не обязательно безопасна для main thread?

Показать разбор ответа

Suspend означает возможность приостановки, а не автоматическое переключение потока. Блокирующие операции должны исполняться на подходящем dispatcher.

5. Network, offline-first и background work

Объяснение

Offline-first сначала опирается на локальные данные и синхронизирует изменения. Повторы сети и конфликты неизбежны. Фоновая работа ограничивается ОС и не гарантирует выполнение в точную секунду.

Задача для самостоятельного решения

Как синхронизировать заметку, созданную без сети?

Показать разбор ответа

Сохранить заметку и очередь отправки локально, присвоить стабильный id, повторять идемпотентно и отмечать подтверждение. Конфликты редактирования разрешать явным правилом.

6. Тесты, profiling, signing и release

Объяснение

Release отличается подписью, оптимизацией и разрешениями. Тест должен покрывать потерю сети и пересоздание UI. Профилирование ищет медленные кадры и удерживаемые объекты, а не только средний CPU.

Задача для самостоятельного решения

Почему перед выпуском нужен сценарий запрета разрешения?

Показать разбор ответа

Пользователь вправе отказать. Приложение должно объяснить ограничение и продолжить доступные функции, а не падать или бесконечно повторять запрос.

Практика

Лабораторная работа

Подготовка

Учебный Android-проект с Jetpack Compose. Фрагмент помещается в Kotlin-файл с Compose imports.

Учебный пример

@Composable
fun Counter() {
    var count by rememberSaveable { mutableStateOf(0) }
    Button(onClick = { count += 1 }) {
        Text("Нажатий: $count")
    }
}

Как работает пример и что ожидать

Кнопка показывает число нажатий, изменение состояния вызывает recomposition. rememberSaveable хранит поддерживаемое небольшое состояние через механизм восстановления; это не база пользовательских данных и не гарантия сохранения любой произвольной модели.

Итоговая работа

Создайте offline-first список заметок с Room и repository. Проверьте поворот, перезапуск процесса, отсутствие сети, конфликт изменения и отказ разрешения. Добавьте UI-тест и инструкцию сборки со списком версий зависимостей.

Проверка результата

1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.

Как оценить работу

По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.