首页 > 解决方案 > 当 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");
            }
        });
    }
}

标签: androidandroid-lifecycleandroid-memoryandroid-background

解决方案


操作系统会从内存中删除这些巨大的对象以增加可用的 ram 内存,因此,当用户返回应用程序时,这些对象为空并崩溃

更准确地说,Android 会终止您的进程。

确实存在一种方法可以知道操作系统何时杀死应用程序的某些部分

Android 不会“[杀死] 应用程序的一部分”。它会终止您的进程。

而且,不,当您的进程即将终止时,您不会收到通知。

并阻止该杀戮过程首先存储这些对象?

不。

您可以使用ProcessLifecycleOwner. 在此之后的任何时候,您的进程都可能因任何原因终止——不仅仅是内存压力。例如,用户可以通过设置应用程序撤销运行时权限。

因此,在您的情况下,如果您不想在进行更改时保存数据,您可以在应用程序移至后台时将数据保存到临时文件中,并在进程开始时从该临时文件中恢复数据再次备份。


推荐阅读