A screen that survives rotation is not necessarily safe from process death. A ViewModel keeps state through configuration changes, but Android can kill a background process to reclaim memory. When the user returns, a new ViewModel is created, and any form values or edits stored only in the old one are gone. Testing rotation alone can therefore hide an important state-restoration failure. Use the storage that matches the data: rememberSaveable for small UI state, SavedStateHandle for small values needed to rebuild a screen, and a database, DataStore, or backend for important or lasting data. For an edit screen, saving an orderId and loading the latest order is often better than saving the full object in SavedStateHandle. Test the real scenario by backgrounding the app, killing its process, and reopening it from Recent Apps to confirm that the screen can rebuild itself.
Journal
How to Review AI-Generated Code Without Slowing Down
A practical workflow for reviewing AI-generated code: smaller diffs, explicit assumptions,...
MVC, MVP, MVVM, and MVI: They Didn’t Replace Each Other. They Evolved...
Compare MVC, MVP, MVVM, and MVI by the problems they solve, the costs they add, and the UI...
Let Your AI Agent Debug the Browser Instead of Guessing: Chrome DevToo...
Give your AI agent controlled Chrome access to inspect console errors, network requests, r...
Use AI to Become a Better Software Developer, Not Just a Faster One
Use a Think, Challenge, Build, Verify, Reflect loop to strengthen engineering judgment wit...
Small Pull Requests Are a Technical Strategy, Not a Team Preference
Learn how small pull requests improve review, feedback, rollback safety, and architecture—...
Your Portfolio Should Explain Decisions, Not Display Screenshots
Build a developer portfolio that proves engineering judgment through constraints, trade-of...
Offline-First Kotlin Multiplatform with Room, Ktor, and Shared ViewMod...
Build an offline-first Android and iOS task feature with Room, Ktor, queued sync, a shared...
MCP Went Stateless: What Changes for Agent Tooling
What MCP 2026's stateless core, explicit state handles, MRTR, caching, Tasks, and OAuth ch...
Claude Code Meets Android CLI: Build, Run, and Test
Use Claude Code with Android CLI to create, build, run, inspect, and test a Jetpack Compos...
Claude Code is not a Chatbot… It is an Execution Engine
Many people use Claude Code as a chatbot… they write a prompt, wait for the reply, modify...
Jetpack Compose Animation
Jetpack Compose simplifies animation by integrating it directly into the component lifecyc...
Test Driven Development
An overview of TDD, its philosophy and core principles. How it reverses the traditional de...
How to create custom annotations in Kotlin
Annotations in Kotlin can significantly enhance the readability, structure, and maintainab...
Effective UI/UX Design in Android Apps (3/3)
Explore the importance of user interface and user experience design in Android app develop...
Effective UI/UX Design in Android Apps (2/3)
Explore the importance of user interface and user experience design in Android app develop...
Effective UI/UX Design in Android Apps (1/3)
Explore the importance of user interface and user experience design in Android app develop...
Kotlin's Interoperability with Java (3/3)
Explore how Kotlin works seamlessly with Java. For Java developers looking to transition t...
Kotlin's Interoperability with Java (2/3)
Explore how Kotlin works seamlessly with Java. For Java developers looking to transition t...
Kotlin's Interoperability with Java (1/3)
Explore how Kotlin works seamlessly with Java. For Java developers looking to transition t...
Security in Android App Development (3/3)
Various security challenges in Android development and how to mitigate them.
Security in Android App Development (2/3)
Various security challenges in Android development and how to mitigate them.
Security in Android App Development (1/3)
Various security challenges in Android development and how to mitigate them.
Introduction to Kotlin Functional Programming (3/3)
Continue with the third and final part of our talk about Functional programming in Kotlin
Introduction to Kotlin Functional Programming (2/3)
Continue with the second part of our talk about Functional programming in Kotlin
Introduction to Kotlin Functional Programming (1/3)
Functional programming in Kotlin is all about treating functions as first-class citizens a...
OkHttp Interceptors
Interceptors in Retrofit's OkHttp Client. When and How to use them.
Kotlin Delegated Properties
What are delegated properties? What are their benefits? How do we use them?
Android Memory Leaks
What is memory leak? What causes it? How to avoid it?
Kotlin Coroutines (3/3)
Our final article in our series. More Coroutines components.
Kotlin Coroutines (2/3)
Continue our Coroutines talk. Let's discuss Coroutines Context.