Android Jetpack Compose by RememberSaveable State 无法保留后退按钮

use*_*550 10 android android-jetpack android-jetpack-compose

我在状态和 Jetpack Compose的“活动或进程重新创建后恢复 UI 状态”部分中的代码示例中找不到savedInstanceState代码示例中显示的函数,该部分显示“跨活动和进程重新创建保留状态”。

我确实找到了包含似乎是重命名或替换的androidx.compose.runtime.saveable 文档,并且其文档还说“......存储的值将在活动或流程重新创建后继续存在”。rememberSaveablesavedInstanceState

然而,当我在代码中使用它时,状态不会在后退按钮后继续存在,尽管它确实会在旋转中继续存在。这与文档所说的相反。

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")
        }
       }
      }
     }
    }
   }
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 15

状态无法在后退按钮后继续存在

在该示例中,这是预期的行为。后退导航的默认行为是销毁 Activity。此时,已保存的实例状态将被丢弃。这并不是 Compose 所独有的,并且自 Android 1.0 以来一直是 Android 的固有行为。

这与文档所说的相反。

文档中使用的“进程终止”是指此流程:

  • 用户在您的应用中
  • 用户切换到启动器(通过主页导航)或另一个应用程序(例如,通过概览屏幕)
  • 在接下来的几分钟(但不到 30 分钟)内,Android 会终止处于后台的进程
  • 通过某种方式使用返回到您的应用程序

届时,Android 将为您分叉一个新的进程,并尝试将您的 UI 恢复到用户离开您的应用程序之前的状态。保存的实例状态是该恢复的一部分。

  • @user2297550:保存实例状态背后的要点是能够在*用户*可能认为应用程序仍在运行但*系统*由于内存不足而有其他想法的情况下恢复UI。将任务滑出概览屏幕意味着用户非常明确地表示他们不再需要该任务,因此无需保留已保存的实例状态。 (7认同)