android - 当 Android 需要内存并杀死您的应用程序时,如何保留数据?
问题描述
在我的应用程序中,我正在处理内存中的一些巨大对象,这些对象在用户使用“保存”功能时会持续存在。问题是,当用户在后台离开应用程序时,没有保存,一段时间后,操作系统会从内存中删除那些巨大的对象以增加可用 ram 内存,因此,当用户返回应用程序时,这些对象为 null 并且它崩溃了。
是否存在一种方法可以知道操作系统何时终止应用程序的某些部分,并阻止该终止进程以首先存储这些对象?如果是这样,我将能够恢复它们,但我在 android 文档中找不到任何内容。
我知道有一种方法叫做onLowMemory
,但这不是解决方案,因为:
虽然没有定义调用它的确切时间,但通常会在所有后台进程都被杀死时发生。
http://developer.android.com/reference/android/app/Application.html#onLowMemory%28%29
编辑:了解应用程序进入前台和后台的示例代码:
public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// register observer for knowing when application goes to background and to foreground
ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver(){
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppStarted() {
Log.d("XXXX", "onAppStarted() called");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppStopped() {
Log.d("XXXX", "onAppStopped() called");
}
});
}
}
解决方案
操作系统会从内存中删除这些巨大的对象以增加可用的 ram 内存,因此,当用户返回应用程序时,这些对象为空并崩溃
更准确地说,Android 会终止您的进程。
确实存在一种方法可以知道操作系统何时杀死应用程序的某些部分
Android 不会“[杀死] 应用程序的一部分”。它会终止您的进程。
而且,不,当您的进程即将终止时,您不会收到通知。
并阻止该杀戮过程首先存储这些对象?
不。
您可以使用ProcessLifecycleOwner
. 在此之后的任何时候,您的进程都可能因任何原因终止——不仅仅是内存压力。例如,用户可以通过设置应用程序撤销运行时权限。
因此,在您的情况下,如果您不想在进行更改时保存数据,您可以在应用程序移至后台时将数据保存到临时文件中,并在进程开始时从该临时文件中恢复数据再次备份。
推荐阅读
- mysql - Windows 10 家庭版(和专业版)上存在 mysql 容器问题的 Docker 工具箱
- php - 如何将制作应用程序的 php 文件文件夹包含在 html 页面中?
- javascript - Ace 编辑器在 laravel 项目中不起作用
- python-3.x - 从相同按钮列表中选择特定按钮
- dart - 如何正确地从父小部件调用函数到子小部件?
- react-native - 在 ImageBackground 中反应原生样式
- javascript - 谷歌浏览器阻止了 iframe 中 window.top.location 的重定向
- c - 是否有任何 c 编译器可以向我展示递归函数的每一步?
- google-cloud-platform - Google Compute Engine 和默认应用程序凭据
- php - 匹配不包含坏词的正则表达式