What if your app could remember everything the user typed, even after a crash or rotation, without extra code?
Why SavedStateHandle in Android Kotlin? - Purpose & Use Cases
Imagine you are building an Android app where users fill out a form. Suddenly, the screen rotates or the app goes to the background. Without special care, all the data the user typed disappears, and they have to start over.
Manually saving and restoring data during screen rotations or process death is tricky and error-prone. You have to write extra code to save each piece of data, remember to restore it correctly, and handle many edge cases. This slows development and causes bugs.
SavedStateHandle is like a smart helper that automatically saves your UI data and restores it after configuration changes or process death. It works seamlessly with ViewModel, so your app remembers what the user was doing without extra hassle.
override fun onSaveInstanceState(outState: Bundle) {
outState.putString("name", nameInput.text.toString())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val name = savedInstanceState?.getString("name")
}class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() { val name = savedStateHandle.getLiveData<String>("name") }
It enables your app to keep user data safe and restore UI state effortlessly, making your app feel smooth and reliable.
Think of a shopping app where you add items to your cart. If you rotate your phone or switch apps, SavedStateHandle keeps your cart items intact without losing them.
SavedStateHandle automatically saves and restores UI data.
It reduces bugs and extra code for handling configuration changes.
It works well with ViewModel for smooth user experiences.
Practice
What is the main purpose of SavedStateHandle in Android Kotlin?
Solution
Step 1: Understand the role of SavedStateHandle
SavedStateHandle is designed to save small pieces of data like UI state during configuration changes such as screen rotations.Step 2: Compare with other options
Options A, B, and D relate to network requests, database connections, and UI layout creation, which are not the purpose of SavedStateHandle.Final Answer:
To save and restore small UI-related data automatically during configuration changes -> Option AQuick Check:
SavedStateHandle saves UI state = C [OK]
- Confusing SavedStateHandle with database or network management
- Thinking it manages large data or files
- Assuming it creates UI layouts
Which of the following is the correct way to store a value "username" in SavedStateHandle named savedStateHandle?
?Solution
Step 1: Recall SavedStateHandle API methods
The correct method to store data isset(key, value).Step 2: Check method names in options
Only savedStateHandle.set("username", "John") usesset, others use incorrect method names.Final Answer:
savedStateHandle.set("username", "John") -> Option BQuick Check:
Use set() to store data = A [OK]
- Using put(), save(), or store() which do not exist
- Confusing with SharedPreferences methods
- Forgetting to use quotes around keys
Given the code below, what will be the output of println(savedStateHandle.get<String>("name"))?
val savedStateHandle = SavedStateHandle()
savedStateHandle.set("name", "Alice")
savedStateHandle.set("age", 30)
savedStateHandle.set("name", "Bob")Solution
Step 1: Analyze the set operations
The key "name" is first set to "Alice", then overwritten with "Bob".Step 2: Determine the value returned by get
Getting "name" returns the latest value, which is "Bob".Final Answer:
Bob -> Option CQuick Check:
Last set value returned = A [OK]
- Assuming first set value is returned
- Confusing key names
- Expecting numeric value for string key
Identify the error in the following code snippet using SavedStateHandle:
val savedStateHandle = SavedStateHandle()
savedStateHandle.set("count", 10)
val count: String = savedStateHandle.get("count") ?: "0"
println(count)Solution
Step 1: Check variable types
The value stored is Int (10), but retrieved as String without conversion.Step 2: Understand Kotlin type safety
Assigning Int to String variable causes a type mismatch error.Final Answer:
Type mismatch: trying to assign Int to String without conversion -> Option DQuick Check:
Type mismatch error = D [OK]
- Ignoring type mismatch errors
- Assuming automatic type conversion
- Thinking SavedStateHandle only stores strings
You want to save a user's score in SavedStateHandle and restore it after a configuration change. Which approach correctly ensures the score is saved and retrieved safely?
class ScoreViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
fun saveScore(score: Int) {
// What to do here?
}
fun getScore(): Int {
// What to do here?
}
}Solution
Step 1: Use correct methods to save and get data
Usesetto save andget<Int>to retrieve with a default fallback.Step 2: Validate type safety and default value
saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0 uses correct method names and safely returns 0 if no score is saved.Final Answer:
saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0 -> Option AQuick Check:
Use set() and get<Int>() with default = B [OK]
- Using non-existent methods like put() or save()
- Storing Int as String unnecessarily
- Not providing default value on get()
Ready to prove it?
Pass the test and this pattern moves unknown
