You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在仪器化测试中重建Activity且不保留非配置实例?

测试Activity从savedInstanceState重建(清除ViewModelStore)的方法

要模拟进程被杀或“不保留活动”后的重建场景(此时ViewModelStore会被清除,仅靠savedInstanceState恢复状态),可以通过以下步骤用ActivityScenario实现:

  • 启动Activity并保存状态
    先正常启动Activity,手动触发状态保存逻辑来生成savedInstanceState Bundle,确保需要恢复的数据都被正确打包:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:54:19