我正在尝试在我的 ViewModel 中使用 savedStateHandle 并对其进行测试。我的简单案例是我只是在 SavedStateHandle 中存储一个 Int 值,并在进程死亡后尝试再次获取它。但它根本不起作用。我正在使用以下依赖项
implementation 'androidx.activity:activity-ktx:1.2.0-alpha08'
implementation "androidx.fragment:fragment-ktx:1.3.0-alpha08"
下面是我的片段,它有一个按钮和一个 TextView。当我单击按钮时,数字 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 中,并在文本视图中正确显示“5”。但是,当我将应用程序置于后台并使用 adb 终止该进程,然后从最近的屏幕重新启动该进程时,整个应用程序将重新启动,并且它不会在 textView 中显示记住的数字。相反,它显示了我在布局 xml 中设置的“Hello”。我正在杀死进程如下
adb shell
am kill <package name>
任何人都可以帮助我,为什么它根本不适合我?我在这里做错了什么?