Android应用按Home键或退出后如何返回最后一个Fragment?
Navigation Component 默认不会自动持久化导航栈状态,导致按Home键或退出应用后重启,会回到导航图设置的startDestination(启动页)。要实现回到最后停留的Fragment,需要手动保存和恢复导航状态,分两种场景处理:
1. 处理按Home键的临时退出场景
通过Activity的onSaveInstanceState保存导航状态,在onCreate中恢复:
- 保存状态:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) findNavController(R.id.nav_host_fragment).saveState()?.let { outState.putBundle("nav_state", it) } }
- 恢复状态:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val navController = findNavController(R.id.nav_host_fragment) savedInstanceState?.getBundle("nav_state")?.let { navController.restoreState(it) } }
2. 处理完全退出应用的场景
完全退出应用时,savedInstanceState不会保留,需要用SharedPreferences持久化导航状态:
- 在
onStop中保存到SharedPreferences:
override fun onStop() { super.onStop() val navController = findNavController(R.id.nav_host_fragment) navController.saveState()?.let { state -> getSharedPreferences("nav_prefs", MODE_PRIVATE) .edit() .putBundle("nav_state", state) .apply() } }
- 在
onCreate中优先从savedInstanceState恢复,失败则从SharedPreferences读取:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val navController = findNavController(R.id.nav_host_fragment) savedInstanceState?.getBundle("nav_state")?.let { navController.restoreState(it) } ?: run { val prefs = getSharedPreferences("nav_prefs", MODE_PRIVATE) prefs.getBundle("nav_state")?.let { navController.restoreState(it) } } }
注意事项
- 确保导航图关联的Activity中,没有在
onCreate里强制调用navController.navigate()跳转到启动页的代码; - 如果需要首次启动必须进入启动页,可以在恢复状态前通过SharedPreferences标记是否为首次打开,再决定是否重置导航栈。
内容的提问来源于stack exchange,提问作者Alaa Hosnii
相关产品推荐
相关产品推荐

