流程死亡后,ViewModel SavedStateHandle数据丢失

问题描述

我正在尝试在viewmodel中使用savedStateHandle并对其进行测试。我的简单情况是,我只是将一个Int值存储在SavedStateHandle中,并尝试在进程终止后再次获取它。但是它根本不起作用。我正在使用以下依赖项

implementation 'androidx.activity:activity-ktx:1.2.0-alpha08'
implementation "androidx.fragment:fragment-ktx:1.3.0-alpha08"

下面是我的片段,其中有一个按钮和一个TextView。当我单击按钮时,数字5被存储在viewmodel的savedStateHandle中,然后通过saveStateHandle的getLiveData方法观察到了同样的数字,并且该数字显示在TextView中。因此,在进程终止后,它应正确还原5的值并将其显示在文本视图中。以下是我的片段代码

class FirstFragment : Fragment() {

    private val viewmodel by lazy{
        viewmodelProvider(this).get(FirstFragmentVM::class.java)
    }


    override fun onCreateView(
            inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first,container,false)
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)

        button_first.setonClickListener {
            viewmodel.rememberNumber(5)
        }

        observeviewmodel()
    }

    private fun observeviewmodel(){

        viewmodel.rememberednumber.observe(viewLifecycleOwner){
            textview_first.text = it.toString()
        }

    }

}

以下是我的viewmodel代码

@ExperimentalCoroutinesApi
@FlowPreview
class FirstFragmentVM(savedStateHandle: SavedStateHandle) : viewmodel() {

    companion object{
        private const val KEY_NUMBER_TO_REMEMBER="number:to:remember"
    }

    private val savedState=savedStateHandle
    val rememberednumber=savedState.getLiveData<Int>(KEY_NUMBER_TO_REMEMBER)


    fun rememberNumber(number:Int){
        savedState.set(KEY_NUMBER_TO_REMEMBER,number)
    }

}

运行此应用程序并单击按钮时,数字5将存储在saveStateHandle中,并且在文本视图中正确显示为“ 5”。但是,当我将应用程序置于后台并使用adb终止该进程,然后从最近的屏幕重新启动该进程时,整个应用程序将重新启动,并且它不会在textView中显示记住的数字。相反,它显示了我在布局xml中设置的“ Hello”。我正在按以下步骤杀死进程

adb shell
am kill <package name>

任何人都可以帮助我,为什么它根本不为我工作?我在这里做什么错了?

解决方法

最后,我找到了原因。如果直接从IDE启动应用程序进程后将其终止,则该应用程序将重新启动。相反,如果我通过从最近刷卡中关闭应用程序来关闭应用程序,请从应用程序抽屉中启动它,然后通过adb将其杀死,从而完美恢复应用程序的状态。