问题描述
我正在尝试在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()
}
}
}
@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将其杀死,从而完美恢复应用程序的状态。