· 6 years ago · Jan 19, 2020, 11:01 PM
1# Android Interview Questions
2
3### Жизненный цикл
4 * Activity
5 * <img src="https://github.com/nowiwr01/Interview/blob/master/materials/activity_lifecycle.png" width="350px" />
6 * Fragment
7 * <img src="https://github.com/nowiwr01/Interview/blob/master/materials/fragments_lifecycle.jpg" width="250px" />
8 * Service
9 * <img src="https://github.com/nowiwr01/Interview/blob/master/materials/service_lifecycle.jpg" width="300px" />
10
11### Activity
12 * Как сохранять состояние Activity при повороте экрана?
13 * Чтобы сохранить состояние активити, нужно переопределить метод onSaveInstanceState() и положить данные в Bundle. При реинициализации активити, Bundle с сохраненным состоянием передается в onCreate() и в onRestoreInstanceState(). Система вызывает onSaveInstanceState() и onRestoreInstanceState() только в том случае, когда необходимо сохранить состояние, например при повороте экрана или при убийстве активити для освобождения памяти. Данные коллбэки **не** вызываются, если пользователь выходит из активити нажав Back или если активити убивается вызовом finish().
14 * Когда вызывается onSavedInstanceState() и onRestoreInstanceState()?
15 * onSaveInstanceState() вызывается после onStop() на версии API ≥ 28. На API < 28 этот коллбэк вызывается перед onStop() и нет гарантий до или после onPause(). А onRestoreInstanceState() вызывается после onStart()
16 * Может ли Android убить Activity, которая находится на переднем плане? Если да, то в каких случаях?
17 * Может, если Activity, находящаяся на переднем плане, потребляет слишком много памяти. Когда с помощью этой Activity достигнуто состояние подкачки памяти, она уничтожается, чтобы UI сохранял свою отзывчивость.
18
19### Fragment
20 * Что такое Fragment и где он может использоваться?
21 * Можно ли создать Fragment без UI? Если да, то в каких случаях это можно использовать?
22 * Что такое FragmentManager?
23 * Что такое FragmentTransaction?
24 * Как восстановить состояние Fragment?
25 * Какие методы вызываются только 1 раз за жизненный цикл?
26 * onAttach(), onCreate(), onDestroy(), onDetach()
27 * Чем отличаются Fragment и Activity? Объяснить их взаимоотношения.
28 * Обычно Activity - отдельный целенаправленный модуль с чётким предназначением (набор номера, просмотр карты, сделать снимок или отправить электронное письмо). Хотя, разработчику ничего не мешает сделать более сложный интерфейс, который содержит в себе несколько сложных модулей. Обычно такие модули принято разделять на Fragments, которые имеют свой жизненный цикл, а так же могут быть добавлены или удалены по желанию. Важно помнить, что жизненный цикл Fragment напрямую зависит от жизненного цикла его Activity. То есть, когда действие приостановлено, то все фрагменты в нем также приостановлены, и когда Activity разрушена, все его фрагменты тоже.
29 * Почему рекомендуется использовать только стандартный конструктор при создании Fragment?
30 * Как взаимодействовать между двумя фрагментами без участия Activity??
31
32### Service & AsyncTask
33 * Что такое Service?
34 * Service - компонент Android приложения, который может выполнять длительные операции в фоновом режиме и не содержит UI. Другой компонент приложения может запустить Service, который продолжит работу в фоновом режиме даже в том случае, когда пользователь перейдет в другое приложение.
35 * Это не значит, что работает в другом потоке.
36 * И это не значит, что вы сможете бесконечно долго что-то делать в фоне. Система убьёт вас, если вы будете злоупотреблять этим.
37 * В каких случаях использование Services полезно?
38 * Чем отличаются Intent Service от Service?
39 * `Service` - базовый класс для всех сервисов, расширив который, можно создать любой сервис. Класс, который расширяет сервис, будет выполняться в Main Thread, поэтому, будет блокировать UI, если таковой имеется. Поэтому, нужно либо создавать отдельный поток в Service, либо использовать его для не слишком долгих операций.
40 * `IntentService` - Подкласс Service. Он Используется, если в сервисе нужно выполнять какие-то тяжелые задачи, и мы не хотим сами возиться с асинхронностью. Принцип работы этого вида сервиса прост. Он создает новый поток для своей работы. Затем берет все Intent пришедшие ему в onStartCommand и отправляет их на обработку в этот поток. Как именно обрабатываются Intent – зависит от нас, т.к. мы сами кодим это в методе onHandleIntent.
41 * Какие типы Services бывают?
42 * `Backgound-Services` запущенны с помощью `context.startService(Intent)`. Они живут до тех пор, пока не вызвали stopSelf() или пока система не убила их.
43 * `Foregraund-Services` - аналогично `Background`, но внутри себя вызвали `startForeground()` и показали уведомление в верхней панели. Системе нравится такой подход больше, потому что мы ничего не скрываем от пользователя.
44 * `Bound-Services` - тоже запускаются через `context.startService(Intent)` и будут жить, пока есть привязанные клиенты (контролировать это можем `bindService()/unbindService()`). Используется для одно/двустороннего взаимодействия.
45 * Какие режимы бывают у Services?
46 * `onStartCommand()` возвращает режим, в котором будет запущен сервис.
47 * `START_NO_STICKY` - если система убила сервис, то не перезапустит его.
48 * `START_STICKY` - если система убила сервис, то перезапустит с intent=null.
49 * `START_REDELIVER_INTENT` - так же, как и `START_STICKY`, но восстановит intent.
50 * Как остановить Service?
51 * Ответ зависит от того, с каким типом Service мы имеем дело. Если это `Background/Foregraund-Services` - нужно вызывать stopSelf() или ждать, пока система сама остановит его. Если это `Bounded-Services`, нужно вызывать unbindService().
52 * Какой метод отличает его, чтобы служба работала в фоновом режиме?
53 * Какие проблемы могут возникнуть при использовании Services?
54 * С каждой версией Android всё больше заботится о батарейке, поэтому нещадно убивает приложения, а иногда не позволяет даже просто так запустить Background-Service. А ещё может убить (и убьёт) их раньше, чем мы закончим всё, что хотели, если приложение не активно и у него нет запущенных экранов. Поэтому, чтобы не возникало проблем, нужно уведомляять пользователя о долгих фоновых операциях с помощью `startForeground().`
55 * Что такое AsyncTask?
56 * Когда нужно использовать Service, а когда AsyncTask?
57 * Какие есть проблемы у Activity и AsyncTask? Как их избежать или решить?
58
59### Intent
60 * Что такое Intent?
61 * Что такое Action?
62 * Что такое Intent Filter?
63 * Что такое StikyIntent?
64 * Что такое PendingIntent?
65 * Объясните основные 3 случая, когда используется Intent.
66 * Отличия Explicit Intent и Implicit Intent.
67
68### Общие
69 * Как происходит отрисовка любого (почти) View в Android?
70 * Расскажите структуру Manifest.xml
71 * Назовите основные компоненты Android приложения.
72 * Что такое Context?
73 * Что такое BroadcastReciever?
74 * Что такое LocalBroadcastManager?
75 * Что такое ContentProvider?
76 * Какая разница между обычным растровым изображением и 9-patch изображениями?
77 * Что за ошибка Application Not Respondin и как избежать её появления в приложении?
78 * Разница между Serializable и Parcelable? Что лучше подходит для Android?
79 * Что такое Views и ViewGroups и чем они отличаются?
80 * Как создать приложение, которое поддерживает все размеры экрана?
81 * Что такое утечки памяти? Приведите пример, когда это может произойти.
82 * Назовите плюсы и минусы хранения данных в SharedPreferences.
83
84### Архитектура
85 * MVC
86 * MVP
87 * MVVM
88 * MVI
89 * Какие приемущества у MVVM над MVP?
90
91### Retrofit2
92 * В чём плюсы использования Retrofit вместо AsyncTask?
93 * Как обрабатывать несколько сетевых вызовов с помощью Retrofit?
94
95### RxJava2
96 * В чём смысл и какие плюсы у реактивного программирования?
97 * Основные принципы Observable и Observer
98 * **Какие типы Observables существуют?**
99 * Observable, Flowable, Single, Completable, Maybe
100 * **Разница и сходство между Observable и Flowable**
101 * В RxJava 2 источники представлены двумя основными типами — Flowable и Observable. Они устроены очень похоже. Оба генерируют от 0..n элементов. Оба могут завершаться успешно или с ошибкой. Зачем два разных типа для представления одной и той же структуры данных? Всё сводится к такой штуке, как backpressure. `Backpressure` позволяет замедлить работу источника данных. Существующие системы имеют ограниченные ресурсы. И с помощью backpressure мы можем сказать всем, кто шлёт нам данные, чтобы они притормозили, потому что мы не можем обрабатывать информацию с той скоростью, с которой она к нам поступает.
102 * **Что такое Backpressure?**
103 * Backpressure - это просто процесс работы с быстрым производителем предметов. Если Observable производит 1.000.000 элементов в секунду, то как обработчик будет обрабатывать подписчик, который может обрабатывать только 100 элементов в секунду? Класс Observable имеет неограниченный размер буфера, это означает, что он буферизует все и передает его подписчику, где вы получаете исключение OutOfMemoryException. Применяя Backpressure к потоку, можно обрабатывать элементы по мере необходимости, ненужные элементы можно отбрасывать или даже сообщать Observable, когда создавать и отправлять новые элементы.
104 * **Какие бывают стратегии работы с Backpressure?**
105 * `Drop:` Это одна из самых простых стратегий. Мы просто указываем, что будем игнорировать все потоковые элементы, которые не могут быть обработаны, пока downstream не сможет принять больше из них.
106 * `Buffer:` Сохраняет элементы в буфере, пока они не будут обработаны.
107 * `Latest:` Если downstream не может справиться с потоком элементов, он прекращает излучать их и ждет, пока он снова не станет доступным. Он продолжает отбрасывать элементы, кроме последнего, который прибыл, и отправляет последний, когда снова становится доступным. В отличии от `Drop` гарантируется, что хотя бы элемент сохраняется.
108 * **Что такое Single?**
109 * `Single` - асинхронный источник одного элемента. Содержит либо один элемент, либо выдаёт ошибку. Он не поддерживает `Backpressure`. Можно представлять его себе как обычный метод.
110 * **Что такое Completable?**
111 * `Completable` ведет себя подобно `Observable`, за исключением того, что он может излучать только сигнал завершения или ошибки (нет onNext() или onSuccess(), как с другими реактивными типами)
112 * **Что такое Maybe?**
113 * `Maybe` представляет отложенное вычисление и выдачу одного значения, вообще никакого значения или исключения. Как и в `Observable`, работающий `Maybe` может быть остановлен через экземпляр `Disposable`, а так же может быть ленивым, может быть «горячим» или «холодным», синхронным или асинхронным.
114 * **from, just — для чего и в чем отличия?**
115 * `just()` - генерит только 1 излучение. Например, `Observable.just(new Integer[]{1, 2, 3})` сгенерит одно излучение с Observer callback `onNext(Integer[] integers)`
116 * `from()` - генерит N излучений: берёт каждый элемент из листа. Например, `Observable.fromArray(new Integer[]{1, 2, 3})` сгенерит 3 излучения с Observer callback `onNext(Integer integer)`
117 * map, flatMap, concatMap, switchMap — для чего и в чем отличия?
118 * Что делают observeOn() и subscribeOn()?
119 * Что будет, если вызвать несколько subscribeOn()? А если несколько observeOn()?
120 * Разница между Hot Observable и Cold Observable?
121
122### Room & SQL
123 * Что такое PrimaryKey?
124 * Что такое Foreign Key?
125 * Как избавиться от проблемы вложенных классов?
126 * Как из таблицы Markers достать уникальные элементы?
127 * Что такое Pattern Matching в SQL?