android - activity 是从非活动应用程序状态恢复的

android - is the activity restored from an inactive app state

我正在从网络加载数据并将其存储在 ViewModel 中。因此,当设备的方向发生变化时,数据会保留下来,我不必从网络上重新加载它。但是,如果应用程序进入非活动状态(由于其他应用程序需要内存),ViewModel 中的数据将被删除,我将需要在恢复 activity/fragment 时重新加载它。如果我们在重新创建 activity/fragment 时在 savedInstanceState 包中找到该标志,则当然可以通过在 onSaveInstanceState() 方法中保存一些标志并从 Web 重新加载数据来避免此问题。然而,这并没有区分从不活动中恢复和简单的方向改变。因此,每次我打开设备时,都会不必要地从服务器重新加载数据。

有没有办法知道 activity/fragment 是否从非活动状态恢复?

请尝试使用 LiveData 实现您的 ViewModel。 For LiveData 使非生命周期对象知道生命周期。 此外,通过使用 SharePreferences 持久化数据为应用程序过早死亡做好准备,因为 onSavedInstanceState 会删除 onDestroy() 中的所有数据,SharePreferences 可以在应用程序重新启动时保存和检索存储的数据。 ViewModel 只处理 UI 相关的事情,不知道什么叫做 LIFECYCLE。所以这就是观察者模式来拯救的原因——LiveData。 如果应用程序到达 onDestroy(),即使 onSavedInstanceState() 也无法拯救。 总之,将 ViewModel 与 LiveData 一起使用并保留数据,以防止应用程序过早死亡,而不是使用 onSavedInstanceState(),而是使用更强大的功能,如 SharedPreferences 等

Is there a way to know if the activity/fragment was restored from an inactive state?

您可以利用以下事实:当您的应用进程被终止时,变量将 return 恢复为默认(未初始化)值,并将其与正常的 savedInstanceState 逻辑相结合。

public class MainActivity extends AppCompatActivity {

    private static boolean processWasAliveTheWholeTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            processWasAliveTheWholeTime = true;
        } else {
            if (!processWasAliveTheWholeTime) {
                // if savedInstanceState is not null, that means we're being recreated.
                // the only way processWasAliveTheWholeTime could be false is if our process was killed.
            }
        }
    }
}