Android 如何打开简历上的最后一个屏幕

Android how to open last screen on resume

这更像是一个建议线程,所以我不能分享任何代码,因为我有 none。

我的问题如下:

我有一个使用导航图的 android 应用程序,如果我使用系统后退按钮离开该应用程序,它将始终在恢复时打开登录屏幕。所以我没有关闭应用程序,我只是把它放到了后台。我的开始目的地确实设置为此登录片段,但我必须更改什么才能在关闭应用程序的屏幕上打开该应用程序?在这种情况下,它是登录后的屏幕,在我的情况下可以指向 2 个不同的片段,所以我不能只是硬编码。

添加或显示 Fragmrnt 时尝试使用 addToBackStack(null)。

getSupportFragmentManager()
    .beginTransaction()
    .addToBackStack(null)//use this to add the fragment to the stack
    .commit;

是的,您可以使用 SharedPreference 来完成。

  1. 在登录片段中创建共享首选项并将其值设置为布尔值。
val sharedPreferences:SharedPreferences = this.requireActivity().getSharedPreferences("OnboardingDetails", Context.MODE_PRIVATE)

        val boarded: Boolean = sharedPreferences.getBoolean("isLogin", false)

        if (boarded) {
            findNavController().navigate(OnboardingFragmentDirections.actionOnboardingFragmentToTransactionListFragment())
        } else {
            sharedPreferences.edit().putBoolean("isLogin", true).apply()
        }
  1. 用户安装应用程序时首次出现登录屏幕时,布尔值为 false。
  2. 执行条件的其他部分使布尔值变为真。这意味着用户已经完成了登录屏幕。
  3. 当用户下次打开您的应用时,布尔值为真,如果部分条件运行,则用户会自动转到下一个片段。

您要使用后退按钮退出应用程序吗? As far as the system's concerned,这是用户关闭应用程序(与将其滑开相同)并且期望应用程序下次“重新启动”。

The user's assumption in these complete dismissal cases is that they have permanently navigated away from the activity, and if they re-open the activity they expect the activity to start from a clean state. The underlying system behavior for these dismissal scenarios matches the user expectation - the activity instance will get destroyed and removed from memory, along with any state stored in it and any saved instance state record associated with the activity.

所以你并没有真正把它放到后台,你正在销毁最后一个 activity/popping 后台堆栈的最后一项,所以下次你从导航流的开头开始应用程序打开它。这是标准行为。

如果您只是通过切换到另一个应用程序/转到主屏幕将其置于后台,它应该会在您切换回它时完全恢复。您可以通过在开发人员选项中启用不要保留活动来测试它,这样系统会在它进入后台后立即销毁它。


导航库文档中有一个示例几乎可以处理这个想法 - 它基本上与 Karmveer 的回答一致,但我想您可能想看看他们建议如何做:

https://developer.android.com/guide/navigation/navigation-conditional

但是,如果您确实想为用户首次打开应用程序并且他们已经登录时设置“默认”第一页,则必须将该数据存储在某个地方,以便在决定时进行检查导航到哪里。并且您必须根据需要对其进行更新(例如,每当用户在它们之间交换时,您将存储最新的)。共享首选项是通常的方式,如果您喜欢

,也可以使用新的 DataStore 东西