为什么我的 savedInstanceState 不工作?

Why my savedInstanceState is not working?

我是 android 使用 kotlin 的工作室的新手。

我想制作多项选择题应用程序,我使用数据 class 和对象常量来提供问题。如果用户选择正确,private var mCurrentPosition(Int) 会加 1,setQuestion() 会改变问题、选择和 correctChoice。

为了防止app关闭后进度被重置,我想把mCurrentPosition的int存起来就好了,所以用了onSaveIntanceState。但是在应用程序关闭后会初始化进度...

class QuizActivity : AppCompatActivity() {

    private var mCurrentPosition: Int = 1
    private var mQuestion300List: ArrayList<Question300>? = null

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

        if(savedInstanceState != null) {
            with(savedInstanceState) {
                mCurrentPosition = getInt(STATE_SCORE)
            }
        } else {
            mCurrentPosition = 1
        }
        setContentView(R.layout.activity_quiz)


        val questionList = Constant.getQuestions()
        Log.i("Question Size", "${questionList.size}")

        mQuestion300List = Constant.getQuestions()

        setQuestion()

        tv_choice1.setOnClickListener {
            if (tv_correctChoice.text.toString() == "1") {
                mCurrentPosition ++
                setQuestion()
            } else {
                tv_choice1.setBackgroundResource(R.drawable.shape_wrongchoice)
            }
        }
        tv_choice2.setOnClickListener {
            if (tv_correctChoice.text.toString() == "2") {
                mCurrentPosition ++
                setQuestion()
            } else {
                tv_choice2.setBackgroundResource(R.drawable.shape_wrongchoice)
            }
        }
        tv_choice3.setOnClickListener {
            if (tv_correctChoice.text.toString() == "3") {
                mCurrentPosition ++
                setQuestion()
            } else {
                tv_choice3.setBackgroundResource(R.drawable.shape_wrongchoice)
            }
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        outState?.run {
            putInt(STATE_SCORE, mCurrentPosition)
        }
        super.onSaveInstanceState(outState)
    }

    companion object {
        val STATE_SCORE = "score"
    }

    private fun setQuestion() {
        val question300 = mQuestion300List!![mCurrentPosition-1]
        tv_question.text = question300!!.question
        tv_choice1.text = question300.choice1
        tv_choice2.text = question300.choice2
        tv_choice3.text = question300.choice3
        tv_correctChoice.text = question300.correctChoice
        tv_now.setText("${mCurrentPosition}")

        tv_choice1.setBackgroundResource(R.drawable.shape_problem)
        tv_choice2.setBackgroundResource(R.drawable.shape_problem)
        tv_choice3.setBackgroundResource(R.drawable.shape_problem)
    }
}

这是我的应用程序代码。请给我帮助:) 谢谢

savedInstanceState 实际上只意味着两件事

  • 幸存的旋转,其中 Activity 被摧毁并重新创建
  • 系统在后台终止您的应用程序 - 所以当您 return 时,Activity 需要按原样重新创建,因此用户看不到应用程序之间的任何区别处于后台,应用程序被杀死以节省资源

onCreate 运行时,如果 Activity 是从以前的状态重新创建的,您将获得一个作为 savedInstanceState 传入的包 - 这包含您添加的所有内容在 onSaveInstanceState 之前应用程序被提前停止。 但是,如果用户关闭了应用程序(通过使用后退按钮退出,或者在任务切换器中将应用程序滑开等),那么这将被视为 重新开始没有状态 可以恢复。并且 savedInstanceStateonCreate 中将为空(这是您可以检查它是否是一个新开始的一种方式)。

因此,如果您希望在用户明确关闭应用程序后仍保持状态,则需要使用其他方法。 Here's the docs on the subject - the typical way is to use SharedPreferences for small data, some kind of database like Room for larger state. DataStore 是新事物,如果您想尝试一下