繁体   English   中英

savedInstanceState 是 null 在第一次应用程序关闭后但不是在第二次

[英]savedInstanceState is null after first app shutdown but not after second

我正在关注这个代码实验室 Android Kotlin 基础知识 04.2:复杂的生命周期情况https://codelabs.developers.google.com/codelabs-koindex/android

在 tast 5 中,您模拟应用程序关闭并使用 onSaveInstanceState()

当我按照说明进行操作时,以及在运行解决方案代码时,第一个应用程序关闭后并没有恢复 saveInstanceState ,而是在第二个应用程序关闭后才恢复。

来自 Codelab 的解决方案代码: https://github.com/google-developer-training/android-kotlin-fundamentals-apps/tree/master/DessertClickerFinal

和 MainActivity 代码

class MainActivity : AppCompatActivity() {

    private var revenue = 0
    private var dessertsSold = 0
    private lateinit var dessertTimer : DessertTimer;
    private var currentDessert = allDesserts[0]

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Timber.i("onCreate called")

        if (savedInstanceState != null) {
            revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
            dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
            dessertTimer.secondsCount =
                    savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
            // Show the next dessert
            showCurrentDessert()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Timber.i("onSaveInstanceState Called")
        outState.putInt(KEY_REVENUE, revenue)
        outState.putInt(KEY_DESSERT_SOLD, dessertsSold)
        outState.putInt(KEY_TIMER_SECONDS, dessertTimer.secondsCount)
    } 

在解决方案代码项目中,我执行以下操作:

  • 运行应用程序,点击甜点(创建数据保存)
  • 将应用程序置于后台,将其杀死
  • 使用最近屏幕打开应用程序
  • onSaveInstanceState 是 null..
  • 再次将应用程序置于后台,将其杀死
  • 使用最近屏幕打开应用程序
  • 已恢复已保存状态

每次都会发生这种情况; 应用程序第一次运行和关闭后,没有任何反应,在我第二次杀死它后,savedState 恢复了。

我使用 Android Studio 和 Kotlin。 我使用以下命令关闭应用程序: adb shell am kill com.example.android.dessertclicker或 Logcat 中的终止应用程序按钮。 两者都给出相同的结果。

我读到一些程序员说你必须在将键值对放到 outstate:Bundle 之后调用 super.onSaveInstanceState,但我只是按照示例代码进行的。 当我尝试调用它时,无论如何我都会得到相同的结果。

有谁知道为什么会这样? 谁能告诉我他们在运行解决方案代码时是否遇到相同的行为?

我相信这可以归结为可以使用旧版本的应用程序保存的已保存实例 state 创建活动吗? . 系统不认为从 最近屏幕启动的活动是从 Android Studio 启动的活动的延续。 也许可以通过强制taskAffinitylaunchMode为您的活动提供建议,但没有什么是防弹的 如果从启动器而不是 Android Studio 运行应用程序,则可以从头开始重现整个周期。

此外,重要的是要记住:

注意

可以同时在后台执行多个任务。 但是,如果用户同时运行多个后台任务,系统可能会开始破坏后台活动以恢复 memory,从而导致活动状态丢失。

尝试包括 onRestoreInstanceState。 此处阅读有关生命周期的更多信息。 但我认为如果你杀死应用程序,它不会保存 state ......也许你应该更好地使用SharedPreferences

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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