Android 通过内存清洗器保存数据

Android 通过内存清洗器保存数据,android,android-activity,viewmodel,android-lifecycle,Android,Android Activity,Viewmodel,Android Lifecycle,我对保存活动的捆绑数据有一个问题。 某些内存清理器(如clean master)以及某些设备的GC似乎会从活动和相应的ViewModel中删除所有数据和捆绑数据,从而导致活动崩溃 我的问题是:是否有方法保存活动加载所需的数据(通常通过bundle传递) 我尝试过通过onSavedInstanceState保存数据的解决方案 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(BUN

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

我的问题是:是否有方法保存活动加载所需的数据(通常通过bundle传递)

我尝试过通过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来保持数据的活跃性,但这些都不起作用。 但是,到目前为止,唯一有效的解决方案是将数据保存到本地存储器(使用或),这会导致其他一些额外的数据管理问题。
即使在保存了数据之后,应用程序的效果就好像在通过后堆栈导航时发生了崩溃一样。

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

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


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

感谢您的反馈。目前我正在寻找替代方案,因为在应用程序的当前状态下,使用本地数据存储将增加大量开发时间,如果数据是从存储或捆绑包加载的,我将不得不以某种方式处理其他潜在问题。使用json文件将SharedReference键值对存储为json是一个具有最小开发开销的选项。我已经有了类似的系统,因此,存储器中的数据格式不构成问题。我的问题是关于使用永久存储的替代方案。没有任何移动操作系统允许您这样存储数据。最贴切的东西是stickybroadcast,但即使是它也被弃用,强烈建议不要使用。就拿它作为使用移动堆栈的代价吧