Bird
Raised Fist0
Android Kotlinmobile~5 mins

SavedStateHandle in Android Kotlin

Choose your learning style10 modes available
Introduction

SavedStateHandle helps you save and restore small pieces of data in your app when the screen rotates or the app is temporarily stopped. It keeps your app's state safe without extra work.

You want to keep user input in a form when the phone rotates.
You need to save a counter value during configuration changes.
You want to restore UI state after the app is killed and restarted by the system.
Syntax
Android Kotlin
class MyViewModel(private val state: SavedStateHandle) : ViewModel() {
    fun saveData(key: String, value: String) {
        state.set(key, value)
    }

    fun getData(key: String): String? {
        return state.get<String>(key)
    }
}

SavedStateHandle is usually passed to your ViewModel by the system.

You use set(key, value) to save and get(key) to retrieve data.

Examples
Saves a username and then retrieves it.
Android Kotlin
state.set("username", "Alice")
val name = state.get<String>("username")
Gets a click count or starts at 0, then increases it by 1.
Android Kotlin
val count = state.get<Int>("clickCount") ?: 0
state.set("clickCount", count + 1)
Sample App

This ViewModel saves a count number. It starts at 0 if no saved value exists. When increment is called, it adds 1 and saves it. The count stays even if the screen rotates.

Android Kotlin
class CounterViewModel(private val state: SavedStateHandle) : ViewModel() {
    fun getCount(): Int {
        return state.get<Int>("count") ?: 0
    }

    fun increment() {
        val current = getCount()
        state.set("count", current + 1)
    }
}

// Usage in Activity (requires SavedStateViewModelFactory):
// val factory = SavedStateViewModelFactory(this.application, this)
// val viewModel = ViewModelProvider(this, factory).get(CounterViewModel::class.java)
// println(viewModel.getCount()) // prints 0 initially
// viewModel.increment()
// println(viewModel.getCount()) // prints 1 after increment
OutputSuccess
Important Notes

SavedStateHandle works well for small, simple data like strings and numbers.

It is not meant for large data or complex objects.

Use it to improve user experience by keeping UI state consistent.

Summary

SavedStateHandle saves small data automatically during configuration changes.

Use set and get methods to store and retrieve data.

It helps keep your app state safe without extra code for saving/restoring.

Practice

(1/5)
1.

What is the main purpose of SavedStateHandle in Android Kotlin?

easy
A. To save and restore small UI-related data automatically during configuration changes
B. To manage database connections
C. To handle network requests
D. To create UI layouts dynamically

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    To save and restore small UI-related data automatically during configuration changes -> Option A
  4. Quick Check:

    SavedStateHandle saves UI state = C [OK]
Hint: Remember: SavedStateHandle saves UI data on config changes [OK]
Common Mistakes:
  • Confusing SavedStateHandle with database or network management
  • Thinking it manages large data or files
  • Assuming it creates UI layouts
2.

Which of the following is the correct way to store a value "username" in SavedStateHandle named savedStateHandle?

?
easy
A. savedStateHandle.put("username", "John")
B. savedStateHandle.set("username", "John")
C. savedStateHandle.save("username", "John")
D. savedStateHandle.store("username", "John")

Solution

  1. Step 1: Recall SavedStateHandle API methods

    The correct method to store data is set(key, value).
  2. Step 2: Check method names in options

    Only savedStateHandle.set("username", "John") uses set, others use incorrect method names.
  3. Final Answer:

    savedStateHandle.set("username", "John") -> Option B
  4. Quick Check:

    Use set() to store data = A [OK]
Hint: Use set() to save data in SavedStateHandle [OK]
Common Mistakes:
  • Using put(), save(), or store() which do not exist
  • Confusing with SharedPreferences methods
  • Forgetting to use quotes around keys
3.

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")
medium
A. null
B. Alice
C. Bob
D. 30

Solution

  1. Step 1: Analyze the set operations

    The key "name" is first set to "Alice", then overwritten with "Bob".
  2. Step 2: Determine the value returned by get

    Getting "name" returns the latest value, which is "Bob".
  3. Final Answer:

    Bob -> Option C
  4. Quick Check:

    Last set value returned = A [OK]
Hint: Last set value for a key is returned by get() [OK]
Common Mistakes:
  • Assuming first set value is returned
  • Confusing key names
  • Expecting numeric value for string key
4.

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)
medium
A. println() cannot print variables
B. Missing key in get() method
C. SavedStateHandle cannot store Int values
D. Type mismatch: trying to assign Int to String without conversion

Solution

  1. Step 1: Check variable types

    The value stored is Int (10), but retrieved as String without conversion.
  2. Step 2: Understand Kotlin type safety

    Assigning Int to String variable causes a type mismatch error.
  3. Final Answer:

    Type mismatch: trying to assign Int to String without conversion -> Option D
  4. Quick Check:

    Type mismatch error = D [OK]
Hint: Match types when getting values from SavedStateHandle [OK]
Common Mistakes:
  • Ignoring type mismatch errors
  • Assuming automatic type conversion
  • Thinking SavedStateHandle only stores strings
5.

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?
    }
}
hard
A. saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0
B. saveScore: savedStateHandle.put("score", score) getScore: savedStateHandle.get("score") as Int
C. saveScore: savedStateHandle.save("score", score) getScore: savedStateHandle.get("score") ?: 0
D. saveScore: savedStateHandle.set("score", score.toString()) getScore: savedStateHandle.get<String>("score")?.toInt() ?: 0

Solution

  1. Step 1: Use correct methods to save and get data

    Use set to save and get<Int> to retrieve with a default fallback.
  2. 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.
  3. Final Answer:

    saveScore: savedStateHandle.set("score", score) getScore: savedStateHandle.get<Int>("score") ?: 0 -> Option A
  4. Quick Check:

    Use set() and get<Int>() with default = B [OK]
Hint: Always use set() and get<Type>() with default fallback [OK]
Common Mistakes:
  • Using non-existent methods like put() or save()
  • Storing Int as String unnecessarily
  • Not providing default value on get()
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard