如果Android重新启动我的应用程序,如何确定它不会加载最新片段?

时间:2019-07-14 02:47:13

标签: android android-fragments android-mvvm

我的应用程序包含两个活动:SignInActivity和MainActivity。 SignInActivity允许用户登录,并初始化应用程序正常运行所需的一堆重要变量。 MainActivity包含一堆组成实际应用程序的片段。这些片段使用带有ViewModel的MVVM体系结构。 Fragment类从其ViewModel加载信息以显示在屏幕上。

一个Fragment AppleFragment通过调用vm.getAppleType().getName()来加载苹果类型(用户先前输入的)。然后,AppleFragment在屏幕上显示苹果的类型。用户只有在设置了苹果类型之后才能导航到AppleFragment。

假设用户在MainActivity和AppleFragment中使用我的应用程序时按下了主页按钮。该应用程序将移至后台,并且可能会被Android操作系统杀死以节省内存。如果是这种情况,然后用户转到“概述”屏幕(即方形按钮)并选择要打开的应用程序,Android将重新启动上次打开的活动(MainActivity),以及上一次打开的片段(AppleFragment),但所有变量(包括ViewModels中的变量)都是新鲜的-即从头开始。

由于AppleFragment在onViewCreated()中加载了vm.getAppleType().getName(),并且ViewModel完全空白-请记住,Android销毁了所有内容以节省内存-vm.getAppleType().getName()导致NPE且应用程序崩溃。

为减轻这种情况,我让MainActivity检查重要的应用程序变量是否已初始化,如果没有初始化,请启动SignInActivity。想法是,在上述情况下,用户将被重定向到SignInActivity,并且应用程序将在用户登录时填充重要变量。用户无法导航至AppleFragment,除非他们设置了Apple类型,然后,ViewModel可以将其分配给AppleFragment进行显示。

这种方法不能完全起作用,因为startActivity()调度SignInActivity,但是不会立即启动它-尤其是要等到MainActivity的所有生命周期方法都已运行完之后,才能立即启动。看来,作为MainActivity的onStart()方法的一部分,最近查看的片段AppleFragment已加载。这是我们遇到麻烦的地方,因为AppleFragment在其onViewCreated方法中调用vm.getAppleType().getName()导致NPE和应用程序崩溃。

1 个答案:

答案 0 :(得分:1)

来自the docs

  

如果不需要存储大量数据并且不需要结构,则应使用SharedPreferences。使用SharedPreferences API,您可以读写原始数据类型的持久键值对:布尔值,浮点数,整数,长型和字符串。

我认为这应该可以解决您的问题。

当变量丢失时,我认为不能将用户重定向到再次登录。我建议将这些值保存在SharedPrefences中。如果您担心安全性,可以阅读:Android SharedPreference security