如何在 onStop() 中保存 UI 视图或 UI 屏幕?

How to save the UI View or UI Screen in onStop()?

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

例子

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

即使我在 onPause() 中根本没有保存任何内容,我的应用程序也会发生同样的情况。因此,我想将 onStop() 中的数据或 UI 状态保存在 OS 中保存在 onPause() 中。并希望在 onCreate().

中恢复相同的内容

我试过的

我试图在 onStop() 中保存 RecyclerView 的状态,并在附加 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() 中保存 OS 中的任何数据。最后想恢复 onCreate().

中的数据

请指导我进行进一步的操作。

快速解决方案:创建一个名为 LastSavedState.java 或任何名称的 class 并让它实现 Parcelable。在onPause()期间,把你想保存的所有东西都放在里面,然后用setArguments(Bundle)setIntent(Intent)(如果你使用Activity)把它放到Bundle里。在 onResume() 期间,您可以使用 getArguments()getIntent() 恢复您​​的状态,并将所有内容设置回您离开的位置。

推荐解决方案:您的应用应遵循 android 架构,如 MVI 或 MVVM,并且每个屏幕都有一个状态,以便您的视图模型或演示者可以在 onPause()/onResume()

您应该尝试保存 savedInstanceState 中的值并尝试恢复它。 正如官方文档建议的那样,也可以使用 ViewModel 来存储复杂数据。

To bridge the gap between user expectation and system behavior, use a combination of ViewModel objects, the onSaveInstanceState() method, and/or local storage to persist the UI state across such application and activity instance transitions. Deciding how to combine these options depends on the complexity of your UI data, use cases for your app, and consideration of speed of retrieval versus memory usage.