Android interview practice
Real Android interview questions as two-minute exercises. Commit to an answer first, then check it and read the full explanation with current Kotlin code.
Prefer to just read? Every question has Show answer. Progress is saved on this device only, separately from the iOS course.
- PredictPick what you think happens, or tap the line with the bug.
- CheckSee whether you were right, and why every other option is wrong.
- Learn itRead the 30-second answer, then the deep dive and follow-ups.
– interview-ready · 200 questions
– of 200 tried
Saved on this device. Interview-ready means you got it right on two different days. Guesses and hints count for less.
Daily 5
The same five questions for everyone today, with a grid to share. Needs JavaScript. Start with the first question.
Readiness by topic
Your progress is saved in this browser only. With JavaScript on, this shows each topic's readiness and lets you export your progress to a file or import it on another device.
Share your progress
Topics
Coroutines
Suspend functions, scopes, dispatchers, structured concurrency, cancellation and errors: the questions every senior Android loop opens with.
18 questions
Flow and StateFlow
Cold and hot streams, StateFlow and SharedFlow, operators, one-off events and safe collection from the UI.
14 questions
Jetpack Compose
State, recomposition, stability, side effects, lists, modifiers and navigation: how Compose really decides what to redraw.
22 questions
Lifecycle and app components
Activities, Fragments, configuration changes, process death, intents, services, receivers and permissions.
18 questions
Kotlin language
Null safety, classes, equality, scope functions, generics, inline functions and what Kotlin 2 and the K2 compiler changed.
20 questions
Views, layouts and RecyclerView
The View system questions still asked in 2026: measuring and drawing, ConstraintLayout, RecyclerView, custom views and resources.
8 questions
Architecture and dependency injection
Layers, unidirectional data flow, MVVM and MVI, repositories, Hilt and modularisation for apps that keep growing.
15 questions
Data and storage
Room, DataStore, migrations, Paging, scoped storage and what to wipe on logout.
10 questions
Background work and notifications
WorkManager, expedited and long-running work, Doze, exact alarms, notifications and push messages.
7 questions
Networking
Retrofit and OkHttp, serialization, interceptors, token refresh, retries, caching and image loading.
8 questions
Performance
The main thread, ANRs, jank, memory leaks, startup, Baseline Profiles, profiling and app size.
12 questions
Testing
Local and instrumented tests, fakes, coroutine and Flow testing, Compose UI tests, screenshots and flaky tests.
9 questions
Security
Keystore, secure storage, biometrics, network security, exported components, WebView, secrets and Play Integrity.
9 questions
Runtime, build and Gradle
ART and DEX, R8, KSP, Gradle builds and variants, garbage collection, threads, and light Java and OOP.
10 questions
Modern Android
Edge-to-edge, predictive back, deep links, accessibility, passkeys, widgets, KMP, on-device AI and target SDK upgrades.
10 questions
Mobile system design
Offline-first data, feeds, chat, images, uploads, billing, location, flags and rollouts, analytics, and incidents.
10 questions
All questions
Coroutines
- What happens to viewModelScope work on rotation?Predict
- Coroutines vs threadsPredict
- What does suspend mean?Pick the fix
- launch vs asyncPredict · timeline
- Structured concurrencyPredict
- CoroutineScope vs CoroutineContextPredict
- Choosing a dispatcherPick the fix
- withContext and main-safetyFill the blank
- Cooperative cancellationSpot the bug
- Don't swallow CancellationExceptionSpot the bug
- Job vs SupervisorJobPredict
- Where CoroutineExceptionHandler worksPick the fix
- Loading several things in parallelOrder the steps
- withTimeout vs withTimeoutOrNullPredict
- Shared mutable statePick the fix
- Collecting safely from the UIPick the fix
- Why not GlobalScope?Pick the fix
- runBlocking on AndroidPredict
Flow and StateFlow
- Cold vs hot flowsPredict
- StateFlow vs SharedFlowPredict
- stateIn and WhileSubscribed(5_000)Pick the fix
- One-off events from a ViewModelPick the fix
- map, filter and transformPredict
- Search-as-you-type with FlowPick the fix
- combine vs zipPredict
- flowOn and context preservationSpot the bug
- Handling errors in a FlowPredict
- Wrapping a listener with callbackFlowSpot the bug
- buffer, conflate and collectLatestPredict · timeline
- Why didn't my StateFlow update?Spot the bug
- LiveData vs StateFlowPick the fix
- ChannelsPredict
Jetpack Compose
- Compose vs the View systemPick the fix
- What triggers recomposition?Predict
- remember vs rememberSaveablePredict
- State hoistingPick the fix
- Stability and skippingPredict
- Deferring state readsPick the fix
- derivedStateOfPick the fix
- LaunchedEffect and its keysPredict
- DisposableEffectFill the blank
- rememberCoroutineScopePick the fix
- rememberUpdatedStateSpot the bug
- Keys in LazyColumnPredict
- Why modifier order mattersPredict
- CompositionLocalPick the fix
- collectAsStateWithLifecycleFill the blank
- Navigation in ComposePick the fix
- Previews that scaleOrder the steps
- Slot APIsSpot the bug
- State lists and mutationSpot the bug
- Compose and Views togetherPick the fix
- Strong skipping modePredict
- Choosing an animation APIPick the fix
Lifecycle and app components
- The Activity lifecycleOrder the steps
- Lifecycle order: A opens BOrder the steps
- Configuration changesPick the fix
- Process deathPredict
- SavedStateHandleFill the blank
- Fragment and view lifecyclesSpot the bug
- How a ViewModel survivesPick the fix
- Launch modes and tasksPredict
- Explicit and implicit intentsPick the fix
- PendingIntent and mutabilityPick the fix
- The Activity Result APIPick the fix
- Services and foreground service typesPick the fix
- Broadcast receiversPick the fix
- Content providersPick the fix
- Runtime permissionsOrder the steps
- Application class and startup workPick the fix
- TransactionTooLargeExceptionPick the fix
- Parcelable vs SerializablePick the fix
Kotlin language
- How Kotlin code runs on AndroidOrder the steps
- Null safety and !!Predict
- val, var and const valPredict
- Data classesPredict
- Sealed classes and exhaustive whenPredict
- == vs ===Predict
- let, run, with, apply, alsoPredict
- Extension functionsPredict
- lateinit vs by lazyPredict
- inline functions and reifiedPick the fix
- Lambdas, function types and fun interfacesPredict
- object, companion object and singletonsPick the fix
- Generics: in, out and star projectionPredict
- Delegation with byPredict
- Smart casts and their limitsPredict
- Value classesPredict
- Collections vs sequencesPredict
- Kotlin 2 and the K2 compilerPick the fix
- @JvmStatic, @JvmField and @JvmOverloadsPick the fix
- Visibility: internal and friendsPick the fix
Views, layouts and RecyclerView
- How a View is measured, laid out and drawnPick the fix
- ConstraintLayoutPick the fix
- RecyclerView, ListAdapter and DiffUtilSpot the bug
- Writing a custom ViewSpot the bug
- Resources and qualifiersPick the fix
- View Binding vs findViewById and Data BindingPick the fix
- Touch event dispatchPredict
- Large screens and window size classesPick the fix
Architecture and dependency injection
- UI, domain and data layersPick the fix
- Unidirectional data flow and UiStateOrder the steps
- MVVM vs MVIPick the fix
- Repositories and a single source of truthPick the fix
- Use cases and the domain layerPick the fix
- Dependency injectionPick the fix
- Hilt basicsFill the blank
- Hilt components and scopesPick the fix
- Runtime arguments with HiltPick the fix
- ModularisationPick the fix
- Modelling errorsPick the fix
- SOLID on AndroidPick the fix
- Design patterns you use every dayPredict
- Navigation between feature modulesOrder the steps
- Hilt vs Koin vs manual DIPick the fix
Data and storage
- Room basicsPick the fix
- How Room Flow queries updatePredict
- Relations, transactions and N+1 queriesPick the fix
- Room migrationsOrder the steps
- DataStore vs SharedPreferencesPick the fix
- Scoped storagePick the fix
- Paging 3Pick the fix
- What to clear on logoutOrder the steps
- Database performancePick the fix
- Cache freshness and stale dataPick the fix
Background work and notifications
- WorkManager basicsPick the fix
- Chaining work and constraintsOrder the steps
- Expedited and long-running workPick the fix
- Doze and App StandbyPick the fix
- Exact alarmsPick the fix
- Notifications and channelsOrder the steps
- Push messages with FCMPredict
Networking
- Retrofit with coroutinesPick the fix
- OkHttp interceptorsPick the fix
- Refreshing an expired token onceSpot the bug
- kotlinx.serialization vs GsonPredict
- Retries with exponential backoffPick the fix
- HTTP caching with OkHttpPick the fix
- Image loadingPredict
- Handling offline and flaky networksPick the fix
Performance
- Looper, Handler and the main threadPredict
- ANRs: causes and fixesPick the fix
- Jank and dropped framesOrder the steps
- Memory leaksSpot the bug
- Cold start timePick the fix
- Baseline ProfilesOrder the steps
- Smooth long listsPick the fix
- StrictModeFill the blank
- Profiling toolsPick the fix
- Macrobenchmark and MicrobenchmarkPick the fix
- Reducing app sizeOrder the steps
- Battery-friendly appsPick the fix
Testing
- Local vs instrumented testsPick the fix
- Fakes, mocks and stubsPick the fix
- Testing coroutines with runTestPredict
- Testing FlowsPick the fix
- Testing a ViewModelOrder the steps
- Compose UI testsFill the blank
- Screenshot testsPick the fix
- Testing Room and migrationsOrder the steps
- Flaky testsPick the fix
Security
- Storing tokens and secrets on devicePick the fix
- Android KeystoreFill the blank
- Biometric authenticationPick the fix
- Network security config and pinningPick the fix
- Exported components and intent safetySpot the bug
- WebView securityPick the fix
- API keys and secrets in the APKPick the fix
- Play Integrity APIOrder the steps
- Least privilege and privacy APIsPick the fix
Runtime, build and Gradle
- ART: interpreter, JIT and AOTOrder the steps
- R8, shrinking and keep rulesPick the fix
- kapt vs KSPPick the fix
- Speeding up Gradle buildsPick the fix
- Build types, flavors and variantsPredict
- Version catalogs and convention pluginsPick the fix
- Garbage collection on AndroidSpot the bug
- Threads, @Volatile and synchronizedPick the fix
- OOP principles in KotlinPick the fix
- Interface vs abstract classPredict
Modern Android
- Edge-to-edge and window insetsPick the fix
- Predictive backPick the fix
- Deep links and App LinksPick the fix
- Accessibility in ComposePick the fix
- Passkeys and Credential ManagerOrder the steps
- Home screen widgets with GlancePick the fix
- Kotlin MultiplatformFill the blank
- On-device AI featuresOrder the steps
- Target SDK upgradesPick the fix
- Foldables and large screensPick the fix
Mobile system design
- Designing an offline-first appOrder the steps
- Designing a social feedPick the fix
- Designing a chat appPick the fix
- Designing an image loading libraryOrder the steps
- Designing reliable uploadsPick the fix
- Handling a crash spike after releaseOrder the steps
- Feature flags and staged rolloutsPick the fix
- Designing subscriptions with Play BillingOrder the steps
- Designing location trackingPick the fix
- Designing an analytics or logging SDKPick the fix
Sources: Question outline adapted from Android-Interview-Questions by Mohsen Mirhoseini, licensed under Apache 2.0. We reorganised the questions, rewrote every answer and added new ones. Credits and license