Android: как сохранить объекты, инициализированные в классе приложения, когда система перезапускает процесс моего приложения
В моем классе приложения у меня есть объект, который используется всеми действиями, запускаемыми с экрана Launcher. Проблема в том, что в случае нехватки памяти система автоматически перезапускает мое приложение (я мог видеть это в настройках -> Приложение -> вкладка "Выполнение процесса"). Так как он перезапускается (это происходит, когда приложение находится в фоновом режиме), объект, который я использую повсюду, сбрасывается в ноль.
Мой сценарий:
В моей Launcher Activity я бью DB и беру значение в потоке, а с помощью Setter & Getter я устанавливаю значение Object в классе Application.
После установки я перехожу к четырем действиям оттуда A(Launcher) -> B -> C -> D
Теперь я работаю в фоновом режиме, и мое устройство работает в режиме "Недостаточно памяти", в этот момент мой процесс прерывается и перезапускается (т.е. в фоновом режиме).
При перезапуске мой объект сбрасывается в ноль. Теперь, если я запускаю свое приложение из недавнего списка или через панель запуска, он по-прежнему запускает последнее действие, откуда я вышел в фоновом режиме, в приведенном выше случае это действие D, где я получаю доступ к Объект, который выбрасывает нулевой указатель.
Мой вопрос
- Есть ли способ сохранить объект на уровне класса приложения, когда система убивает его (как мы делаем в 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);
}