The Road to State-Driven Android: From MVC to MVI-Flavored MVVM
Android teams get a clear, up-to-date decision map: what to adopt for new Compose projects, how to migrate legacy MVP code, and which official tools (StateFlow, Navigation 3, Hilt) align with Google's reference architecture. The convergence on a single UiState and UDF also means the platform's ecosystem now shares a common state-management vocabulary, reducing cross-project friction and making hiring and knowledge transfer more predictable.
This survey of Android architecture from 2008 to 2026 maps the progression from MVC's massive Activity through MVP's interface explosion to MVVM's data-driven views, and finally to the current mainstream: MVVM fused with MVI's single-state and explicit-intent ideas, coordinated under Google's official Unidirectional Data Flow (UDF) guidance. The official recommendation is not a specific pattern but a layered structure — UI, optional domain, and data layers with a Repository as single source of truth — plus UDF with state flowing down and events flowing up.
Practical comparisons cover nine dimensions across MVC, MVP, and MVVM, including testability, coupling, memory leak risk, and configuration change support. State holders like LiveData, StateFlow, and SharedFlow are examined, with StateFlow recommended for UI state and SharedFlow explicitly discouraged for one-off events. The article also details Compose's state hoisting, Navigation 3's state-driven back stack, the MVI/MVVM fusion, Clean Architecture's relation to the official layering, and the UseCase boilerplate debate, concluding with a five-step migration path from MVP to MVVM and a list of anti-patterns such as holding Activity context in ViewModel or scattering page state across multiple LiveData streams.
The line between MVI and MVVM has blurred so far that the article itself concedes the official UDF + StateFlow recommendation is a community-labeled variant of MVI; teams should stop debating labels and focus on single-state and unidirectional flow mechanics.
Navigation being pulled into state management, as Navigation 3 does, completes the declarative loop: once every UI concern including navigation is a value, testing and debugging become uniformly state-based.
The main cost of the modern stack is not the architecture itself but the reactive-programming learning curve; testing strategy shifts from mocking views to asserting state transitions.
The repeated warning against SharedFlow for one-off events suggests that even with official guidance, event modeling remains the least-standardized corner of Android architecture.