如何在仪器化测试中重建Activity且不保留非配置实例?
测试Activity从savedInstanceState重建(清除ViewModelStore)的方法
要模拟进程被杀或“不保留活动”后的重建场景(此时ViewModelStore会被清除,仅靠savedInstanceState恢复状态),可以通过以下步骤用ActivityScenario实现:
启动Activity并保存状态
先正常启动Activity,手动触发状态保存逻辑来生成savedInstanceStateBundle,确保需要恢复的数据都被正确打包:val scenario = ActivityScenario.launch(MainActivity::class.java) var savedState: Bundle? = null scenario.onActivity { activity -> savedState = Bundle() activity.onSaveInstanceState(savedState!!) }完全销毁当前Activity
调用scenario.close()彻底销毁当前Activity实例,这会清除所有非配置实例(包括ViewModelStore),和进程被杀后的状态一致:scenario.close()用保存的状态重建Activity
使用带savedInstanceState参数的launch重载方法启动Activity,此时系统会完全从Bundle中恢复状态,不会传递之前的非配置实例:val newScenario = ActivityScenario.launch( MainActivity::class.java, savedState )验证场景符合预期
在重建后的Activity中,检查ViewModel是否为全新实例,同时确认savedInstanceState中的数据正确恢复:newScenario.onActivity { activity -> val viewModel = ViewModelProvider(activity)[MyViewModel::class.java] // 验证ViewModel是全新的(临时数据丢失) assert(viewModel.temporaryData == null) // 验证从savedInstanceState恢复的数据正确 assert(viewModel.persistedData == "saved_test_value") }
这种方式和recreateActivity()的核心区别在于:recreateActivity()会保留onRetainNonConfigurationInstance()返回的对象(包括ViewModelStore),而上述流程通过“销毁-重启+传入savedState”的方式,完全跳过了非配置实例的传递,完美模拟进程被杀或开启“不保留活动”后的重建场景。
内容的提问来源于stack exchange,提问作者olshevski
相关产品推荐
相关产品推荐

