P
prepair.app
Start interview →
EnglishУкраїнськаРусскийDeutsch
🟩

Middle Android (Kotlin)Android developer interview questions

Middle · 2–4 years of experience

Android interviews focus on Kotlin idioms, coroutines, and the platform lifecycle — most senior questions are really asking whether you understand that your process can be killed at any moment. Below are the questions asked most often, each with a model answer. Middle: deeper understanding, optimization, and real-world situations.

Try it — no account needed
Preparing your question…

Topics to prepare

Kotlin language features
Coroutines and Flow
Android lifecycle
Jetpack Compose
Architecture and DI
Room, Retrofit and testing

9 Middle-level questions with answers

1

What is a coroutine, and how is it different from a thread?

Answer

A coroutine is a suspendable computation scheduled by the Kotlin runtime; a thread is scheduled by the OS. Suspension releases the thread instead of blocking it, so thousands of coroutines share a small pool. This is why a blocking call inside a coroutine defeats the purpose entirely — it holds the thread it was meant to free.

2

What is structured concurrency and what does a CoroutineScope guarantee?

Answer

That every coroutine started in a scope is a child of it, so cancelling the scope cancels them all and the scope does not finish until they do. In practice this is viewModelScope — work stops when the ViewModel is cleared. Launching in GlobalScope opts out and is how work outlives the screen that started it.

3

What is the difference between `Flow`, `StateFlow` and `SharedFlow`?

Answer

A Flow is cold — it produces values when collected, once per collector. StateFlow is hot, always holds a current value, and emits it to every new collector, which is what UI state wants. SharedFlow is hot without a current value and suits events that should not replay — a navigation command or a snackbar.

4

What is recomposition in Compose, and what makes it happen too often?

Answer

Compose re-runs composables whose inputs changed. It happens too often when a lambda or an unstable type is recreated on every parent render, or when a whole screen reads one frequently changing value. The fixes are remember, hoisting state so only the part that needs it reads it, and stable types — and the recomposition counts in Layout Inspector tell you where.

5

Why is the `Context` you hold a common source of leaks?

Answer

Because an Activity context is tied to a screen, and anything long-lived holding it keeps that whole screen in memory. The usual cases are a singleton initialised with an Activity, a static reference, or a listener never unregistered. Application context is right for anything outliving a screen — but it cannot inflate themed views, which is why the mistake gets made.

6

How would you find why an app is slow to start?

Answer

Measure first: adb shell am start -W gives cold, warm and hot start times, and the system trace shows what runs before the first frame. The usual causes are work in Application.onCreate — SDK initialisation especially — synchronous disk or network reads, and doing on the main thread what could be deferred until after the first frame.

7

What is the difference between `launch` and `async`?

Answer

launch starts work and returns a Job with no result; async returns a Deferred you await. Use async only when you need the value, and start both before awaiting either if you want them concurrent. An async whose result is never awaited swallows its exception, which is a quiet way to lose a crash.

8

`Serializable` or `Parcelable` — which and why?

Answer

Parcelable is the Android one: you describe how the object is written and read, so there is no reflection and it is measurably faster for passing data between components. Serializable is the Java marker interface — almost free to write, slow at runtime, and it allocates heavily. In Kotlin the argument mostly disappears because @Parcelize generates the boilerplate, which removes the only real reason people chose Serializable.

9

Doze, App Standby, `WorkManager` or a `Service` — how do you choose?

Answer

Doze and App Standby are the system deferring your background work when the device is idle or your app is unused, which is why an alarm or a network call simply does not happen when you expected. WorkManager is for deferrable work that must eventually happen and survive process death and reboot — sync, upload, cleanup. A foreground service is for work the user is aware of right now, like playback or navigation, and it must show a notification. Reaching for a plain background service instead is how work silently stops running on modern Android.

🦎

Reading answers is not enough

In a real interview you speak under pressure. Cam asks these same questions, scores every answer, and shows exactly what to fix.

Practice a Middle Android (Kotlin) interview →
Free · 3 interviews per month

Other levels — Android (Kotlin)

Junior Android (Kotlin)Senior Android (Kotlin)All Android (Kotlin) questions

Other specializations

🔍Middle Manual QA🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🦫Middle Go Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🟣Middle .NET Backend Developer🔷Middle C++