0

我正在尝试在我的 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>

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

4

1 回答 1

1

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

于 2020-09-16T10:02:21.010 回答