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

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

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

В моей активности Launcher я нажимаю на БД и беру значение в потоке, а с помощью Setter & Getter я устанавливаю значение объекта в классе приложения.

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

Теперь я работаю в фоновом режиме, и мое устройство работает с малой памятью, мой процесс останавливается и перезапускается в этот момент (т. Е. В фоновом режиме).

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

У меня вопрос,

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

person Sudarshan    schedule 03.04.2014    source источник


Ответы (2)


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

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

person cbrulak    schedule 03.04.2014

Вы сохраняете последнее состояние объекта вSaveInstanceState и возвращаетесь вRestoreInstanceState. Всю информацию о воссоздании 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);
}
person Sinan Kozak    schedule 03.04.2014
comment
Вопрос был о сохранении данных из подкласса Application при перезапуске процесса, а не о жизненном цикле Activity. - person GreyBeardedGeek; 02.04.2015