Viewmodel SavedStateHandle进程终止后丢失的数据



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

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

下面是我的片段,它有一个按钮和一个文本视图。当我单击按钮时,数字5存储在ViewModel的savedStateHandle中,然后通过savedStateHandle的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存储在savedStateHandle中,并显示"0";5〃;在文本视图中正确显示。但是,当我把应用程序放在后台,使用adb终止进程,然后从最近的屏幕重新启动进程时,整个应用程序都会重新启动,它不会在textView中显示记住的数字。相反,它显示了";你好"这是我在布局xml中设置的。我正在按照以下扼杀过程

adb shell
am kill <package name>

有人好心帮我,为什么它根本不适合我?我在这里做错了什么?

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

最新更新