Как сохранить данные, когда Android требует памяти и убивает ваше приложение? - PullRequest
1 голос
/ 06 мая 2020

В моем приложении я работаю с некоторыми огромными объектами в памяти, которые сохраняются, когда пользователи используют функцию «сохранить». Проблема в том, что когда пользователь оставляет приложение в фоновом режиме без сохранения, через некоторое время ОС удаляет эти огромные объекты из памяти для увеличения свободной оперативной памяти, поэтому, когда пользователь возвращается в приложение, эти объекты имеют значение 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");
            }
        });
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

ОС удаляет эти огромные объекты из памяти для увеличения свободной оперативной памяти, поэтому, когда пользователь возвращается в приложение, эти объекты равны нулю, и оно вылетает

Точнее, Android завершает ваш процесс.

Существует ли способ узнать, когда ОС убивает части приложения

Android не «[уничтожает] части приложения приложение". Это завершает ваш процесс.

И, нет, вы не информируете, когда ваш процесс собирается завершить.

и заблокировать этот убивающий процесс, чтобы сначала сохранить эти объекты? *

Нет.

Вы можете узнать, когда ваше приложение в целом переходит в фоновый режим, используя ProcessLifecycleOwner. В любое время после этого ваш процесс может быть завершен по любой причине - это не просто давление памяти. Пользователь может отозвать разрешение на выполнение, например, через приложение «Настройки».

Итак, в вашем случае, если вы не хотите сохранять данные при внесении изменений, вы можете сохранить данные во временном файл, когда ваше приложение переходит в фоновый режим, и восстановить данные из этого временного файла, когда ваш процесс снова запустится.

0 голосов
/ 06 мая 2020

Пробовали ли вы использовать собственный класс Application, расширяющий Application.ActivityLifecycleCallbacks? Также в самом классе Application есть OnTrimMemory

...