Android: как сохранить объекты, инициализированные в классе приложения, когда система перезапускает процесс моего приложения

В моем классе приложения у меня есть объект, который используется всеми действиями, запускаемыми с экрана Launcher. Проблема в том, что в случае нехватки памяти система автоматически перезапускает мое приложение (я мог видеть это в настройках -> Приложение -> вкладка "Выполнение процесса"). Так как он перезапускается (это происходит, когда приложение находится в фоновом режиме), объект, который я использую повсюду, сбрасывается в ноль.

Мой сценарий:

В моей Launcher Activity я бью DB и беру значение в потоке, а с помощью Setter & Getter я устанавливаю значение Object в классе Application.

После установки я перехожу к четырем действиям оттуда A(Launcher) -> B -> C -> D

Теперь я работаю в фоновом режиме, и мое устройство работает в режиме "Недостаточно памяти", в этот момент мой процесс прерывается и перезапускается (т.е. в фоновом режиме).

При перезапуске мой объект сбрасывается в ноль. Теперь, если я запускаю свое приложение из недавнего списка или через панель запуска, он по-прежнему запускает последнее действие, откуда я вышел в фоновом режиме, в приведенном выше случае это действие D, где я получаю доступ к Объект, который выбрасывает нулевой указатель.

Мой вопрос

  1. Есть ли способ сохранить объект на уровне класса приложения, когда система убивает его (как мы делаем в Activity onSaveInstanceState).

2 ответа

Вы можете сделать что-то вроде использования Shared Preferences, чтобы сохранить данные об объекте и перестроить его. (Вы также можете использовать БД, локальные файлы и т. Д.).

Но если я могу немного отклониться от конкретного вопроса: знаете ли вы, почему ваше приложение убивают по причинам памяти? Вы нацеливаетесь на действительно низкое конечное устройство или оборудование? Или, может быть, ваше приложение должно быть оптимизировано, чтобы сохранить / повторно использовать память?

Вы сохраняете последнее состояние объекта onSaveInstanceState и получаете обратно onRestoreInstanceState. В этой лучшей практике вы можете найти всю информацию о воссоздании Activity. Я предлагаю вам прочитать активность жизненного цикла

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
Другие вопросы по тегам