Bird
Raised Fist0
Android Kotlinmobile~8 mins

Why ViewModel survives configuration changes in Android Kotlin - Publishing Best Practices

Choose your learning style10 modes available
Build & Publish - Why ViewModel survives configuration changes
Performance Impact

Using ViewModel helps keep your app smooth by preserving UI data during screen rotations or other configuration changes. This avoids reloading data or restarting heavy tasks, which keeps frame rates stable around 60fps and reduces battery drain.

Optimization Tips

To keep 60fps rendering, use ViewModel to hold UI data and avoid re-fetching or recalculating on every rotation. Combine ViewModel with LiveData or StateFlow to update UI efficiently without blocking the main thread.

App Size and Startup Time

ViewModel is part of Android Jetpack libraries, which add minimal size to your app (a few hundred KB). It does not increase startup time noticeably because it only creates or restores data when needed, not at app launch.

iOS vs Android Differences

Android ViewModel is designed to survive configuration changes like rotations by tying data to the lifecycle of UI controllers. iOS uses different patterns like ViewControllers and state restoration APIs to handle similar cases. Android ViewModel is unique in its lifecycle-aware design.

Store Review Guidelines

Using ViewModel aligns with Android best practices recommended by Google Play. It helps avoid crashes or poor user experience during rotations, which can lead to negative reviews. Ensure your app handles lifecycle events gracefully to meet quality standards.

Self-Check Question

Your app takes 5 seconds to load this screen after rotation. What's likely wrong? You are probably reloading data or restarting tasks instead of using ViewModel to preserve state across configuration changes.

Key Result
Using ViewModel preserves UI data across configuration changes, improving app smoothness and battery life without increasing app size or startup time.

Practice

(1/5)
1. Why does a ViewModel survive configuration changes like screen rotations in Android?
easy
A. Because it is tied to the lifecycle of the activity or fragment and not recreated on configuration changes
B. Because it saves data to a file on disk automatically
C. Because it uses static variables to hold data
D. Because it runs in a separate background thread

Solution

  1. Step 1: Understand ViewModel lifecycle

    A ViewModel is designed to be tied to the lifecycle of an activity or fragment but survives configuration changes like rotations.
  2. Step 2: Why it survives configuration changes

    When a configuration change happens, the activity is destroyed and recreated, but the ViewModel instance is retained and reused.
  3. Final Answer:

    Because it is tied to the lifecycle of the activity or fragment and not recreated on configuration changes -> Option A
  4. Quick Check:

    ViewModel lifecycle = survives config changes [OK]
Hint: ViewModel survives because it outlives activity recreation [OK]
Common Mistakes:
  • Thinking ViewModel saves data to disk automatically
  • Confusing ViewModel with static variables
  • Assuming ViewModel runs on a background thread
2. Which of the following is the correct way to get a ViewModel instance in an Activity using Kotlin?
easy
A. val model = ViewModelProvider.get(this, MyViewModel::class.java)
B. val model = MyViewModel()
C. val model = ViewModelProvider(this).get(MyViewModel::class.java)
D. val model = ViewModel()

Solution

  1. Step 1: Identify correct ViewModelProvider usage

    The correct syntax to get a ViewModel instance is using ViewModelProvider with the activity or fragment as owner.
  2. Step 2: Check Kotlin syntax

    Using ViewModelProvider(this).get(MyViewModel::class.java) is the standard way to get the ViewModel instance.
  3. Final Answer:

    val model = ViewModelProvider(this).get(MyViewModel::class.java) -> Option C
  4. Quick Check:

    ViewModelProvider(this).get() = correct syntax [OK]
Hint: Use ViewModelProvider(this).get() to get ViewModel [OK]
Common Mistakes:
  • Instantiating ViewModel directly with constructor
  • Using incorrect ViewModelProvider syntax
  • Confusing ViewModel class with instance
3. Given this code snippet in an Activity, what will be the output after a screen rotation?
class MyViewModel : ViewModel() {
  var counter = 0
}

// In Activity
val model = ViewModelProvider(this).get(MyViewModel::class.java)
model.counter += 1
println(model.counter)
medium
A. 1 on first launch, then resets to 0 after rotation
B. 1 on first launch, then increments to 2 after rotation
C. Always prints 0
D. Throws an error on rotation

Solution

  1. Step 1: Understand ViewModel data retention

    The ViewModel instance survives configuration changes, so its data like counter is preserved.
  2. Step 2: Trace counter increment

    On first launch, counter is 0, incremented to 1 and printed. After rotation, the same ViewModel instance is used, counter is 1, incremented to 2 and printed.
  3. Final Answer:

    1 on first launch, then increments to 2 after rotation -> Option B
  4. Quick Check:

    ViewModel retains data = increments preserved [OK]
Hint: ViewModel keeps data, so counter increments across rotations [OK]
Common Mistakes:
  • Assuming ViewModel resets on rotation
  • Thinking counter always starts at 0
  • Expecting an error due to rotation
4. What is wrong with this code that tries to use ViewModel in an Activity?
class MyViewModel : ViewModel() {
  var data = "Hello"
}

// In Activity
val model = MyViewModel()
println(model.data)
medium
A. The println statement is incorrect
B. The data variable must be private
C. ViewModel cannot have variables
D. ViewModel should not be instantiated directly; use ViewModelProvider instead

Solution

  1. Step 1: Identify ViewModel instantiation error

    ViewModel must be obtained via ViewModelProvider to survive configuration changes, not created with constructor.
  2. Step 2: Explain consequence

    Direct instantiation means a new ViewModel is created every time, losing data on rotation.
  3. Final Answer:

    ViewModel should not be instantiated directly; use ViewModelProvider instead -> Option D
  4. Quick Check:

    Use ViewModelProvider, not constructor [OK]
Hint: Never instantiate ViewModel with constructor directly [OK]
Common Mistakes:
  • Creating ViewModel with constructor
  • Thinking private variables fix lifecycle issues
  • Blaming println for errors
5. You want to keep user input data safe during screen rotations in your app. Which approach best uses ViewModel to achieve this?
hard
A. Store user input in a ViewModel property and update it on every input change
B. Save user input in SharedPreferences and reload after rotation
C. Use static variables in the Activity to hold user input
D. Recreate the ViewModel on each rotation and reset user input

Solution

  1. Step 1: Identify best practice for preserving UI data

    ViewModel is designed to hold UI-related data that survives configuration changes like rotations.
  2. Step 2: Choose correct data handling method

    Storing user input in a ViewModel property and updating it on input changes keeps data safe and avoids unnecessary disk operations.
  3. Final Answer:

    Store user input in a ViewModel property and update it on every input change -> Option A
  4. Quick Check:

    ViewModel holds UI data safely across rotations [OK]
Hint: Keep UI data in ViewModel properties updated live [OK]
Common Mistakes:
  • Using SharedPreferences for temporary UI data
  • Using static variables which can cause leaks
  • Recreating ViewModel loses data
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