Найти в Дзене

Основные компоненты андроида. Собеседование.

Решила я походить по собеседованиям и оценить свои знания и стоимость на рынке. Но сначала было бы неплохо подготовиться.

Начнем с основных компонентов андроида. Этот вопрос бывает на каждом собеседовании и без него точно не обойтись. Я буду писать так, как если бы я отвечала на настоящем собеседовании.

Я вот думала, как бы я ответила. Тут есть два варианта: можно просто рассказать про компоненты и что они делают. А можно начать с "Основными компонентами любого Android-приложения являются компоненты, управляемые средой выполнения". И вот тут будет интересно, потому что собеседующий скорее всего зацепится за среду выполнения, а это как раз то что мне нужно.

Итак, представим настоящее интервью.

— Хорошо, Аня. Расскажи про основные компоненты андроида. Какие они бывают?

— Основными компонентами любого Android-приложения являются компоненты, управляемые средой выполнения: Активити, Сервисы, Broadcast Receiver и Content Provider. Конфигурация и взаимодействие этих компонентов определяют поведение приложения. Перечисленные компоненты имеют разные зоны ответственности и разные жизненные циклы, но все они являются точками входа в приложение. Из каждого компонента мы можем запустить любой другой с помощью интента. Каждый компонент должен быть зарегистрирован в AndroidManifest.

Если немного подробнее про компоненты и что они делают, то:

Activity — по сути, это экран, который видит пользователь. Именно здесь происходит взаимодействие с пользователем: показываем ему информацию, обрабатываем ввод и т.п. В активити у нас располагаются всякие элементы: кнопки, фрагменты, изображения и другие различные View. Из-за всего этого, объем памяти, потребляемый активити, может существенно увеличиваться.

Когда пользователь перемещается между экранами, экземпляры активити образуют стек. Положение в стеке определяет состояние каждого экземпляра. Состояние может быть:

  • Активный — активити на переднем плане, которая полностью видна.
  • Приостановлена — активити отображается частично.
  • Остановлена — активити не видна. Например, пользователь перешел на другой экран.
  • Неактивна — активити удалена.

Это состояние определяет системный приоритет приложения, а это влияет напрямую на возможность завершения приложения и на планирование выполнения потоков.

Жизненный цикл активити завершается, когда пользователь возвращается к предыдущему экрану или когда активити вызывает метод finish().

Сервисы — они могут выполняться в фоне без взаимодействия с пользователем. Довольно часто сервисы используют для снятия нагрузки с других компонентов, когда операция длинная и превосходит длительность существования другого компонента. Сервисы могут работать в двух режимах: started и bound.

  • В первом случае просто запускаем сервис через context.startService(intent), где передаем явный или неявный Intent. Завершаем с помощью context.stopService(intent).
  • Во втором режиме несколько разных компонентов могут подключиться к сервисы через context.bindService(intent, serviceConnection, flag), где тоже передаем явный или неявный интент. И вот после такого подключения компоненты могут взаимодействовать с сервисом через serviceConnection и разорвать связать через context.unbindService(serviceConnection). Сервис автоматически удаляется, когда последний компонент разорвет связь.

ContentProvider — помогает использовать какие-то данные внутри одного приложения или совместно с другими. Мы можем получить доступ к любым данным, но обычно ContentProvider используется с базами данных. Т.е. любое приложение может предоставить свои данным другим приложениям, которые работают в других процессах.

BrodcastReceiver — этот компонент принимает сообщения, которые отправляют другие компоненты нашего приложения, другие компоненты чужих приложений или вообще сам Android. Все входящие сообщения фильтруются, чтобы понять, какие именно сообщения нужны данному экземпляру. Компонент обязательно должен быть зарегистрирован, чтобы начать прием сообщений. А потом еще надо отменить регистрацию, чтобы зря не работал. Если регистрируем статически в манифесте, то компонент автоматически получает сообщения, пока приложение установлено.

За что можно зацепиться в этом ответе и какие могут быть следующие вопросы? Попробуем каждый разобрать.

  1. А что за среда выполнения? Можно поподробней?
  2. Ты сказала, что у активити увеличивается объем затраченной памяти. А можно подробнее?
  3. А точно каждый компонент должен быть зарегистрирован в манифесте?
  4. Давай поподробнее про любой компонент и жизненный цикл. В каких потоках они выполняются.
  5. Что за системный приоритет и как приложение может завершиться?
  6. Какие бывают интенты?
  7. Какие флаги при создании сервиса есть?

Дубль статей в телеграмме — https://t.me/android_junior

Мой твиттер в телеграмме — https://t.me/android_junior_notes