【问题标题】:How to save the UI View or UI Screen in onStop()?如何在 onStop() 中保存 UI 视图或 UI 屏幕?
【发布时间】:2021-09-11 17:12:33
【问题描述】:

我有一个图库应用。其中我使用RecycylerView 显示照片。每当用户在onStop() 中离开应用程序时,我想保存 UI 的内容,并在用户再次在 onCreate() 中打开应用程序时恢复相同的内容。简而言之,我想消除图像加载,显示以前的 UI,然后在后台加载图像。因此,用户不会看到图像占位符。并且会觉得图片是瞬间加载的。

示例

假设您使用的是 Instagram。您按下主页按钮并导航到 WhatsApp。发送了一些消息,然后回到 Instagram。你发现你的屏幕看起来一样。因为当onPause() 事件被触发时,操作系统保存了 UI 状态。 (我不完全知道触发onPause()时android OS会保存什么。)并在触发onResume()事件时恢复相同。

即使我在 onPause() 中根本没有保存任何内容,我的应用程序也会发生同样的情况。因此,我想将该数据或 UI 状态保存在 onStop() 中,而操作系统正在将其保存在 onPause() 中。并且想在onCreate()中恢复一样。

我的尝试

我尝试将RecyclerView 的状态保存在onStop() 中,并在附加adapter 时恢复它。

...
 @Override
    public void onStop() {
        super.onStop();
        State = layoutManager.onSaveInstanceState();
    }

    ...
     adapter = new PhotosAdapter(requireActivity().getApplicationContext(), arrayList, getActivity(), this);
        recyclerView.setAdapter(adapter);
        layoutManager.onRestoreInstanceState(State);
...

但是,这不起作用。我遇到的问题是,如果用户在RecyclerView 中间并按下主页按钮然后返回应用程序RecyclerView 将从顶部显示并且用户必须再次滚动到中间。所以,我发现在onPause() 中保存状态可以解决这个问题。所以,我认为它可能会拯救整个layoutManager。并尝试将其保存在onStop()。但是,正如预期的那样,它没有用。

我知道覆盖 onSaveInstanceState() 会有所帮助。但是,这里不是关于 int、string 或任何数据类型。我想将屏幕上的所有内容保存在onStop() 中,以及操作系统在onPause() 中保存的任何数据。最后想恢复onCreate()中的数据。

请指导我进行进一步的步骤。

【问题讨论】:

  • 你用什么来显示图像?使用 glide 或 picasso 等库,您可以明确选择是否使用应用缓存。

标签: android image android-recyclerview gallery android-lifecycle


【解决方案1】:

您应该尝试将值保存在 savedInstanceState 中并尝试恢复它。 正如官方文档建议使用ViewModel 来存储复杂数据一样。

要弥合用户期望和系统行为之间的差距,请结合使用 ViewModel 对象、onSaveInstanceState() 方法和/或本地存储,以在此类应用程序和活动实例转换之间保持 UI 状态。决定如何组合这些选项取决于您的 UI 数据的复杂性、应用的用例,以及检索速度与内存使用情况的考虑。

【讨论】:

    【解决方案2】:

    快速解决方案:创建一个名为LastSavedState.java 的类或其他任何东西,并让它实现Parcelable。在onPause() 期间,将要保存的所有内容放入其中,然后使用setArguments(Bundle)setIntent(Intent)(如果您使用的是活动)将其放入Bundle 中。在onResume() 期间,您可以使用getArguments()getIntent() 恢复您的状态并将所有内容设置回您离开的位置。

    推荐解决方案:您的应用应遵循 MVI 或 MVVM 等 Android 架构,并为每个屏幕设置一个状态,以便您的视图模型或演示者可以在 onPause()/onResume() 期间保存和恢复状态

    【讨论】:

    • 我在onPause() 期间保存必要的详细信息,并在onResume() 期间恢复。但是,我想在onStop() 期间保存 UI,并在用户关闭应用、从最近的应用中清除并重新打开应用后在onCreate() 期间恢复它。
    • 我不知道要保存什么来保留 UI。我解释了我的场景以及我想要保存的内容。但是,我不知道应该保存什么来保留代码中最后显示的视图。
    • 您需要阅读有关活动生命周期的更多信息
    • 您需要的与您所要求的不同,您想在用户关闭并清除您的应用后保留 UI?然后,您可以选择将所有内容保存到本地存储或存储库,并在用户重新打开您的应用时重新加载它们。
    • @javdromero 浏览了 android 的官方文档,这很有帮助。但是,他们在那里提到将字符串、int 等数据类型保存在 bundle 中。但我想知道我应该保存哪些数据以及如何保存。
    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多