Upgrade to Pro — share decks privately, control downloads, hide ads and more …

To save or not to save App state in Android

To save or not to save App state in Android

This presentation prepared for GDG Vinnytsia.

Avatar for Yurii Poudanien

Yurii Poudanien

November 29, 2019

Other Decks in Programming

Transcript

  1. Who care about it? • Your customer • Your clients

    • Your mates • Your team leader • Your manager • ...but why? Today is 2019, we can just start app from scratch.
  2. A million years ago… and JetPack • AsyncTask • Loader

    • onRetainInstanceState • Save/Restore Instance state in Bundles • Fragments for save some data (Don't forget about setRatainInstance(true))
  3. Cases, when it can happens... Configuration change (rotation, change language

    etc.) System can kill your app, when memory is low (memory pressure) )
  4. Avoid losing data when configuration changes 1. Use android:configChanges="orientation|screenSize" for

    Activity. But be ready to change UI by hand. 2. Retained Fragment (Google says that it will be deprecated) 3. Save data by pack it to Bundle in onSaveInstanceState(outState: Bundle) 4. ViewModel
  5. How app saves your data? 1. Activity collect all data

    from arguments, bundle for save instance and arguments. --------------------------------Very big iterations of pain and blood-------------------------------- 2. The end of this magic is -> void onActivitySaveInstanceState(Activity activity, Bundle outState); in Application class
  6. Your best friends • Android Profiler • DDMS • LogCat

    • Debugger • Developer settings on device -> Don't keep Activities
  7. Add dependencie The last version is 1.0.0-rc2, so let's start

    use it. implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02'
  8. Class overview The SavedStateHandle class has the methods you expect

    for a key-value map: • get(String key) • contains(String key) • remove(String key) • set(String key, T value) • keys()
  9. Add SavedStateHandle to ViewModel class SomeViewModel(private val state: SavedStateHandle) :

    ViewModel() { companion object { private const val SOME_KEY = "some_key" } fun getSomeString(): LiveData<String> = state.getLiveData(SOME_KEY, "some default string") fun setSomeString(someString: String) { state.set(SOME_KEY, someString) } }
  10. Use in Fragment or Activity override fun onActivityCreated(savedInstanceState: Bundle?) {

    super.onActivityCreated(savedInstanceState) viewModel = SavedStateViewModelFactory(requireActivity().application, this).let { ViewModelProvider(this, it).get(SomeViewModel::class.java) } viewModel.getSomeString().observe(viewLifecycleOwner, someObserver) }
  11. What about my own SavedStateViewModelFactory? class NewViewModelStateFactory( private val someStringForViewModel:

    String, owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null ) : AbstractSavedStateViewModelFactory(owner, defaultArgs) { override fun <T : ViewModel?> create( key: String, modelClass: Class<T>, handle: SavedStateHandle ): T { return SomeViewModel(handle, someStringForViewModel) as T } }
  12. How it works with LiveData VM+ SSH UI ViewModel+ SavedStateHandle

    UI UI request to save some data UI listen reaction from VM VM save data to SSH and notify about it by LiveData
  13. How it works with LiveData VM+ SSH UI ViewModel+ SavedStateHandle

    save it UI UI request to save some data UI listen reaction from VM VM save data to SSH and notify about it by LiveData
  14. How it works with LiveData VM+ SSH UI ViewModel+ SavedStateHandle

    save it Update UI UI request to save some data UI listen reaction from VM VM save data to SSH and notify about it by LiveData
  15. Benefits 1. Helps to pack all data saving logic in

    one place - ViewModel 2. Add ability to make reaction on some changes by using ViewModel as middleware.
  16. Materials for presentation Full lifecycle diagram: https://github.com/OleksandrKucherenko/android-lifecycle Official Doc ViewModel+SaveState:

    https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate Medium Resource: https://proandroiddev.com/saving-ui-state-with-viewmodel-savedstate-and-dagger-f77bcaeb8b0 8
  17. About me Poudanien Yurii Android Software Engineer at ONSEO GitHub:

    https://github.com/Y-E-P LinkedIn: https://www.linkedin.com/in/poudanen