Android иногда заставляет убивать приложение

Я начинаю деятельность A, затем начинаю активность B.
Я нажимаю кнопку дома, а затем жду долгого времени.
Когда я возобновляю заявку, она останавливается.

02-03 18:42:54.413 828-844/system_process I/ActivityManager: Force stopping ru.tabor.search appid=10089 user=0: from pid 20405
02-03 18:42:54.414 828-844/system_process I/ActivityManager: Killing 30212:ru.tabor.search/u0a89 (adj 7): stop ru.tabor.search
02-03 18:42:54.445 828-5948/system_process I/WindowState: WIN DEATH: Window{18b92c9b u0 ru.tabor.search/ru.tabor.search.modules.authorization.AuthorizationActivity}
02-03 18:42:54.447 828-845/system_process I/WindowState: WIN DEATH: Window{1cd0cfe4 u0 ru.tabor.search/ru.tabor.search.modules.registration.RegistrationActivity}
02-03 18:42:54.519 828-844/system_process I/ActivityManager:   Force finishing activity 3 ActivityRecord{25a8977f u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593}
02-03 18:42:54.520 828-844/system_process I/ActivityManager:   Force finishing activity 3 ActivityRecord{d516838 u0 ru.tabor.search/.modules.registration.RegistrationActivity t2593}
02-03 18:42:54.523 828-20666/system_process W/ActivityManager: Spurious death for ProcessRecord{21ff313b 0:ru.tabor.search/u0a89}, curProc for 30212: null
02-03 18:42:59.890 828-1247/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10100000 cmp=ru.tabor.search/.modules.authorization.AuthorizationActivity} from uid 10089 on display 0
02-03 18:42:59.903 828-1247/system_process V/WindowManager: addAppToken: AppWindowToken{1c4987a0 token=Token{279a08a3 ActivityRecord{9f5afd2 u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593}}} to stack=1 task=2593 at 0
02-03 18:42:59.919 828-891/system_process V/WindowManager: Adding window Window{1735e91b u0 Starting ru.tabor.search} at 4 of 8 (after Window{2ab6bf53 u0 com.cleanmaster.mguard/com.keniu.security.main.MainActivity})
02-03 18:43:19.288 828-1673/system_process I/ActivityManager: Start proc 21366:ru.tabor.search/u0a89 for activity ru.tabor.search/.modules.authorization.AuthorizationActivity

Как это исправить?

Ответ 1

Как будто я знаю, вы не можете что-то сделать! это поведение системы сбора мусора android!

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

если у вас есть какая-либо информация в этой деятельности, которую вы хотите сохранить, сохраните ее здесь;

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

когда вы вернетесь к этой активности,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState!=null){
    // GET #savedInstanceState AND USE THE OBJECT YOU STORED
    }
}

Это все, что вы можете сделать.

Ответ 2

Пропускаете ли вы что-то как дополнение к действию? Если нет, попробуйте удалить чистый мастер с вашего устройства.

Ответ 3

Ваше приложение утечки? если телефон работает с низким объемом памяти, он убьет приложение hog памяти. если есть процесс, выполняющийся в этой деятельности, перенесите его в службу и вызовите startForeground() внутри oncreate.

Ответ 4

Восстанавливает активность:

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

Таким образом, вы не можете остановить систему от убийства вашего приложения.

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

Другой вариант - реализовать собственный IntentService.

Цитата из Services Руководство по API:

Система Android заставит остановить службу только тогда, когда память низкая и он должен восстановить системные ресурсы для активности, у которой есть пользователь фокус.

Ответ 5

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

onResume метод жизненного цикла Activity, особенно onResume и убедитесь, что вы это прекрасно понимаете. Так много временных приложений вылетает из-за неправильного использования методов жизненного цикла Activity.

Еще одной важной частью является рассмотрение проекта для Activity, независимо от того, что случилось с постоянными данными, ваша Activity должна отображать свой пользовательский интерфейс с некоторым значением по умолчанию. Таким образом, предположение таково: если у меня есть данные, которые я буду отображать, если у меня их нет, мне действительно все равно. Ваш пользовательский интерфейс никогда не должен падать с данными или без них. Вы можете использовать ресурсы, например, String.xml, dimens.xml для хранения значений по умолчанию или даже в макетах.

Если вы все еще хотите пойти с синглтон-классом, это прекрасно, но убедитесь, что вы делаете следующую проверку каждый раз, когда пытаетесь получить доступ к вашему синглтону.

if (instance==null)
    instance=CurrentActivity.getInstance()

Метод getInstance() не только вернет вам текущий экземпляр, но также убедится, что

  • Инициализирует все объекты и переменные
  • Другие одноэлементные методы как метод экземпляра

Не статически доступ к данным из одного действия в другое. Это не очень хорошо для Android, особенно для типовой проблемы, с которой вы сейчас сталкиваетесь, а также это не очень хорошая практика программирования ООП.

Я рекомендовал SharedPreference. Слишком лучший способ сохранить данные, если они соответствуют вашим требованиям.

Если вы хотите передать данные из другого компонента Android, такого как Activity, Service или BroadcastReciever, вы можете поместить их в пакет и отправить как намерение. И, как всегда, это хранилище данных SQLLite, файловый ввод-вывод и т.д. И т.д.

Надеюсь, что это поможет вам.

Ответ 6

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

Ответ 7

Я знаю, что этот вопрос очень старый, но для тех, кто все еще ищет ответ, попробуйте отключить оптимизацию батареи и режим ожидания для вашего конкретного приложения в настройках Android. Это должно работать.