简体   繁体   中英

Android Jetpack Compose by rememberSaveable State does not survive Back Button

I cannot find the savedInstanceState function shown in code examples in the Restore UI state after activity or process recreation section of the State and Jetpack Compose that the section says "retains state across activity and process recreation."

I did find the androidx.compose.runtime.saveable documentation which contains rememberSaveable which seems to be the renaming or replacement of savedInstanceState and its documentation also says "... the stored value will survive the activity or process recreation."

However, when I use it in my code, the state does not survive the back button, although it does survive rotations. That's contrary to what the documentation says.

package com.example.jetwatch

import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.*
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue

class MainActivity : AppCompatActivity() {
 override fun onCreate(bundle: Bundle?) {
  super.onCreate(bundle)
  setContent {
   MaterialTheme(colors = if (isSystemInDarkTheme()) darkColors() else lightColors()) {
    Surface {
     Column {
      Row {
       Column {
        var m by rememberSaveable { mutableStateOf(0) }
        Text("m = $m")
        Button(onClick = { ++m }) {
         Text("bump")
        }
       }
      }
     }
    }
   }
  }
 }
}

the state does not survive the back button

In that sample, this is expected behavior. The default behavior of back navigation is to destroy the activity. Saved instance state is discarded at this point. This is not unique to Compose and has been stock Android behavior since Android 1.0.

That's contrary to what the documentation says.

"Process termination", as used in the documentation, refers to this flow:

  • User is in your app
  • User switches to the launcher (via home navigation) or to another app (eg, via the overview screen)
  • Over the course of the next several minutes (but fewer than 30), Android terminates your process while it is in the background
  • Use returns to your app by one means or another

At that point, Android will fork a fresh process for you and try to restore your UI to where you had been before the user switched away from your app. The saved instance state is part of that restoration.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM