首页 > 解决方案 > 通过内存清理器保存数据

问题描述

我对保留 Activity 的捆绑数据有疑问。某些内存清理器(例如 clean master)以及某些设备的 GC 似乎会从活动和相应的 ViewModel 中删除所有数据和捆绑数据,从而导致活动崩溃。

我的问题是:有没有办法保存活动加载所需的数据(通常通过捆绑传递)?

我已经尝试过尝试通过 onSavedInstanceState 保存数据的解决方案

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(BUNDLE_ARGUMENT_CUSTOMER_ID, this.mViewModel.getCustomer().getId());

    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if (savedInstanceState != null) {
        this.mViewModel.setCustomer(new Customer(savedInstanceState.getInt(BUNDLE_ARGUMENT_CUSTOMER_ID, -1)));
    }
}

除了依靠 ViewModel 来保持数据活跃,这些都没有奏效。但是,到目前为止,唯一可行的解​​决方案是将数据保存到本地存储(使用SharedPreferenceInternalStorage),这会引发其他数据管理的其他问题。即使在保存数据之后,应用程序的效果就像在通过返回堆栈导航时发生了崩溃一样。

标签: androidandroid-activityviewmodelandroid-lifecycle

解决方案


不幸的是,您将不得不使用某种形式的更永久的存储,例如文件或 SQLite,因为这些“清理器”的全部目的是回收正在使用的资源。
您可以选择将数据存储在云提供商(如 firebase)中并请求它。firebase 为您提供了存储在免费层上的 gb 数据。虽然这是开销,但我强烈建议只使用文件或 SQLite。这是您需要采用的最佳实践

在任何情况下,用户将这些清洁器放在他们的手机上都不是你的错,你只需要优雅地管理应用程序的生命周期

一种选择是禁用历史记录,这样用户就无法导航回堆栈。另一种选择是在尝试显示数据之前始终确保将数据加载到内存中,并在数据被过早擦除的情况下显示错误消息。您可以检测到用户设备上安装的其他应用程序并通知他们使用这些应用程序会使您的应用程序崩溃(但我不建议这样做,因为它会增加权限开销,从而减少愿意下载您的应用程序的人数)


推荐阅读