当Android需要内存并杀死您的应用程序时,如何持久保存数据?

时间:2020-05-06 14:23:39

标签: android android-lifecycle android-memory android-background

在我的应用程序中,我正在处理内存中的一些大对象,当用户使用“保存”功能时这些对象会保留下来。问题在于,当用户在不保存的情况下将应用程序留在后台时,操作系统会在一段时间后从内存中删除那些巨大的对象,以增加可用的ram内存,因此,当用户返回到该应用程序时,这些对象为空且它崩溃了。

是否存在一种知道操作系统何时终止应用程序部分并阻止该终止过程来首先存储这些对象的方法?如果是这样,我将能够恢复它们,但是我可以在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");
            }
        });
    }
}

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用扩展Application.ActivityLifecycleCallbacks的自定义Application类? Application类本身中也有OnTrimMemory

答案 1 :(得分:0)

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

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

是否存在一种知道操作系统何时杀死应用程序部分的方法

Android不会“杀死应用程序的某些部分”。它会终止您的过程。

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

并阻止该杀死过程首先存储那些对象?

否。

您可以使用ProcessLifecycleOwner来确定应用整体何时移至后台。在此之后的任何时间,您的进程都可能由于任何原因而终止—这不仅是内存压力。例如,用户可以通过“设置”应用撤消运行时权限。

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

相关问题