Mobile. Everything recorded here becomes a permanent entry in their history.
Ask the prepared questions and mark each answer. The score sets the grade.
What are the main states of a mobile app lifecycle, and why do they matter?
Not running, foreground/active, background, suspended/stopped, terminated. The OS can pause or kill the app at any time, so save state and release resources when going to the background, and restore when coming back.
Why must long-running work never run on the main (UI) thread?
The main thread draws the UI and handles touches. Blocking it freezes the app, and the OS may kill it (ANR on Android, watchdog on iOS). Do network, disk and heavy work in the background and update the UI back on the main thread.
How do you handle an unreliable network in a mobile app?
Show loading, error and retry states; set timeouts; cache data locally so the app works offline; retry with backoff; queue writes and sync later; and handle a request finishing after the user has left the screen.
How do you release a mobile app safely, given users update slowly?
Beta testing (TestFlight / internal testing tracks), phased or staged rollout, crash and analytics monitoring, feature flags to switch features off remotely, and keep the backend compatible with old app versions — optionally a forced-update check for critical fixes.
What is an optional in Swift, and what are safe ways to unwrap it?
A value that may be nil (String?). Unwrap with if let / guard let, optional chaining (a?.b), or ?? for a default. Avoid force unwrapping ! because it crashes on nil.
nil
String?
if let
guard let
a?.b
??
!
What is the difference between a struct and a class in Swift?
Structs are value types (copied on assignment, no inheritance); classes are reference types (shared instance, inheritance, deinit). Prefer structs for models; SwiftUI views are structs.
Explain `@State`, `@Binding` and `@Observable` / `@StateObject` in SwiftUI.
@State is simple local state owned by a view. @Binding gives a child read-write access to a parent’s state. @Observable (or ObservableObject with @StateObject/@ObservedObject) holds reference-type model state shared across views; the view owning it creates it once.
@State
@Binding
@Observable
ObservableObject
@StateObject
@ObservedObject
How do you make a network request with async/await and update the UI safely?
Use try await URLSession.shared.data(from:), decode with JSONDecoder into a Codable type, catch errors, and update UI state on the main actor (@MainActor). Start it from .task {} so it is cancelled when the view disappears.
try await URLSession.shared.data(from:)
JSONDecoder
Codable
@MainActor
.task {}
What is a retain cycle and how do you avoid one with closures?
Two objects hold strong references to each other, so neither is freed (memory leak). Common with closures capturing self. Break it with [weak self] (or unowned when the lifetime is guaranteed) and weak delegates.
self
[weak self]
unowned
weak
What problems do actors and `@MainActor` solve in Swift concurrency?
Actors protect their mutable state so only one task touches it at a time, preventing data races. @MainActor guarantees code runs on the main thread, which UI updates require. The compiler enforces these rules (Sendable checking).
Explain certificates, provisioning profiles and how an app gets onto TestFlight.
A signing certificate proves the developer’s identity; a provisioning profile ties the app ID, certificate, devices and capabilities (entitlements) together. Archive with a distribution profile, upload to App Store Connect, then distribute to testers via TestFlight after processing (and beta review for external testers).
How does Kotlin handle null safety?
Types are non-null by default; String? may be null. Use safe calls ?., the Elvis operator ?: for defaults, and let. !! throws if null and should be avoided.
?.
?:
let
!!
What happens to an Activity on a configuration change such as rotation, and how do you keep data?
The Activity is destroyed and recreated. Keep UI state in a ViewModel (survives configuration changes) and use SavedStateHandle / rememberSaveable for state that must survive process death.
ViewModel
SavedStateHandle
rememberSaveable
What is recomposition in Jetpack Compose, and why hoist state?
When state read by a composable changes, Compose re-runs that composable to update the UI. Hoisting moves state up to the caller so composables are stateless, reusable and testable, with one source of truth (state down, events up).
Describe MVVM on Android: what belongs in the ViewModel and what in the repository?
The UI observes state from the ViewModel and sends it events; the ViewModel holds UI state (e.g. StateFlow) and logic, and survives configuration changes. The repository owns data access (network, Room database) and hides where data comes from.
StateFlow
What is structured concurrency with coroutines, and why use `viewModelScope`?
Coroutines are started in a scope and are cancelled with it, so work never outlives its owner. viewModelScope cancels its coroutines when the ViewModel is cleared, preventing leaks and wasted work. Use Dispatchers.IO for blocking I/O.
viewModelScope
Dispatchers.IO
Explain cold vs hot flows, and the difference between `StateFlow` and `SharedFlow`.
A cold Flow starts producing for each collector when collected; a hot flow emits regardless of collectors. StateFlow always has a current value and replays the latest to new collectors (UI state). SharedFlow can have no value and configurable replay (one-off events).
Flow
SharedFlow
How do you sign and release an app on Google Play, and how does a staged rollout help?
Build an Android App Bundle (AAB) signed with the upload key (Play App Signing holds the app signing key), bump versionCode, upload to a testing track, then production. A staged rollout releases to a percentage of users first so crashes can be caught and the rollout halted.
versionCode
A 90–100B 80–89C 70–79D 60–69E below 60· Basic 1pt, Intermediate 2pt, Advanced 3pt
Currently verified E · they self-assessed E
Leave a dimension blank if this assessment did not cover it — a blank is more honest than a guess, and blanks show as gaps rather than zeros.
The grade rests on the Q&A alone. Cite a practical task, code review or project work as well to raise confidence.
Using AI is not a negative. What matters is whether they understand and control the solution.
Not assessed yet — leave it blank if this review did not cover it.
Thin or single-source evidence — treat this level as provisional.