Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.75 KB | None | 0 0
  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()` - с помощью этого оператора можно указать Scheduler, в котором будет выполняться процесс Observable до встречи observeOn() (в каком потоке будет работать наш источник данных)
  120. * `observeOn()` - применение этого оператора приводит к тому, что последующие операции над “излученными” данными будут выполняться с помощью Scheduler, переданным в этот метод (в каком потоке мы будем использовать наш результат)
  121. * Комбинируя эти два метода, можно добиться асинхронной загрузки данных из интернета и отображения их на экране в главном потоке приложения.
  122. * **Что будет, если вызвать несколько subscribeOn()? А если несколько observeOn()?**
  123. * Многократный вызов `subscribeOn()` ни к чему не приведёт - будет использован тот, который ближе всего к Observable источнику.
  124. * Каждый следующий вызов `observeOn()` будет приводить к тому, что последющие операции после использования данного метода будут выполняться в другом потоке, указанном Scheduler`ом.
  125. * **Что такое Producer?**
  126. * `Producer` - источник данных/значений для нашего Observable. Это может быть итератор, или что-то зацикленное над массивом. По сути, это все, что мы используем, чтобы получить значения и передать их в Observer.next().
  127. * **Что такое Cold Observable?**
  128. * Observable является «холодным», если его основной Producer создается и активируется во время подписки. Это означает, что если наблюдаемые являются функциями, то производитель создается и активируется путем вызова этой функции.
  129. * **Что такое Hot Observable?**
  130. * Observable является «горячим», если его основной производитель либо создан, либо активирован вне подписки.
  131. * **Разница между Hot Observable и Cold Observable?**
  132. * `Cold Observable`
  133. * Не рассылает объекты, пока на него не подписался хотя бы один подписчик;
  134. * Если observable имеет несколько подписчиков, то он будет рассылать всю последовательность объектов каждому подписчику.
  135. * `Пример` Любой Observable, созданный через Observable.create()
  136. * `Hot Observable`
  137. * Рассылает объекты, когда они появляются, независимо от того есть ли подписчики;
  138. * Каждый новый подписчик получает только новые объекты, а не всю последовательность.
  139.  
  140. ### Room & SQL
  141. * **Что такое PrimaryKey?**
  142. * Аннотацией `@PrimaryKey` мы помечаем поле, которое будет ключом в таблице. Так же в таблице может быть несколько ключей, для этого нужно использовать `@Entity(primaryKeys = {"column1","column2"})`
  143. * Что такое ForeignKey?
  144. * Внешние ключи позволяют связывать таблицы между собой.
  145. * Как избавиться от проблемы вложенных классов?
  146. * Использовать аннотацию `@Embedded`, которая подскажет Room, что надо просто взять поля из указанного класса и считать их полями текущей таблицы.
  147. * Как из таблицы Markers достать уникальные элементы?
  148.  
  149. * Что такое Pattern Matching в SQL?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement