Что происходит, когда заканчиваются все действия приложения? - программирование
Подтвердить что ты не робот

Что происходит, когда заканчиваются все действия приложения?

Сценарий:

У меня четыре действия в приложении для Android, давайте скажем A, B, C и D. В приложении есть один класс Constants.java, который расширяет класс Application, чтобы поддерживать состояние глобального приложения. Класс Constants имеет все постоянные переменные приложения. Поток активности подобен этому A-->B-->C-->D. Когда нажимается кнопка "Назад" из Activity A, я вызываю метод finish(), который завершит действие A и закроет приложение. После этого, если я открываю приложение из всех приложений, в Constants.java есть переменная, значение которой сохраняется от последнего запуска. То же самое не происходит, когда я делаю System.exit(10), а затем Process.killProcess(Process.myPid()) из действия A (нажимается назад).

Вопросы:

  • Будет ли завершение всех действий вызовом finish() каждого действия закроет приложение (его процесс)?
  • Как значение переменной сохраняется, даже если все действия завершены (закрыты)?
  • Можно ли позвонить System.exit(10), а затем Process.killProcess(Process.myPid()) для выхода из приложения?

Update:

Как я могу очистить константы приложения при выходе из приложения (Back press of HomeActivity)?

4b9b3361

Ответ 1

1) Нет, Android не гарантирует этого. Это зависит от ОС, чтобы решить, прекратить ли это процесс.

2) Поскольку экземпляр Activity все еще живет в VM Dalvik. В Android каждый процесс имеет отдельную виртуальную машину Dalvik.

Каждый процесс имеет свою виртуальную машину (VM), поэтому приложение код запускается изолированно от других приложений.

Когда вы вызываете finish(), это не означает, что экземпляр Activity - это сбор мусора. Вы сообщаете Android, что хотите закрыть Activity (больше не показывать). Он все равно будет присутствовать до тех пор, пока Android не решит убить процесс (и таким образом прекратит работу DVM), или экземпляр будет собран с мусором.

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

3) Я бы этого не сделал, если у вас не было очень сильной причины. Как правило, вы должны позволить Android обрабатывать, когда убивать ваше приложение, если только что-то в вашем состоянии приложения, которому требуется приложение reset, когда оно теряет фокус.

Источник цитат

Ответ 2

Закончив все действия, вызвав завершение() каждого действия, закроет приложение (его процесс)?

Нет, не следует. Это связано с тем, что действия не являются единственным компонентом приложения. Сервисы, BroadcastReceivers могут работать без пользовательского интерфейса. Поддерживая процесс Application во время его работы, Android обеспечивает более быструю реакцию на пользователя, снова открывающего приложение, или более быстрый запуск служб и т.д., Поскольку экземпляр приложения не нужно воссоздавать.

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

Как значение переменной сохраняется, даже если все ее действия завершены (закрыты)?

Ваша переменная находится в классе Application, которая следует за моделью Singleton, и, следовательно, ваше значение будет сохраняться до тех пор, пока не будет убит весь процесс приложения.

Кроме того, finish() вызывает только onDestroy(), который не является деконструктором, как описано здесь. Таким образом, даже переменные активности могут сохраняться после того, как был вызван финал, поскольку ваш экземпляр все еще хранится до тех пор, пока Android не почувствует необходимость его уничтожить или ваш процесс будет убит.

Можно ли назвать System.exit(10), а затем Process.killProcess(Process.myPid()) для выхода из приложения?

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

Ответ 3

для вашего обновления:

How can I clear the application constants on exit of the application(Back press of the HomeActivity)?

Переопределить onBackPressed внутри вашей HomeActivity и перед вызовом super.onBackPressed() очистить всю переменную. Если у вас есть сеттер для строки, расположенной внутри вашего подкласса Application:

@Override
public void onBackPressed() {
    getApplication().setMyString(null);
    super.onBackPressed();
}

Если у вас много состояний для очистки, вы можете написать метод, который reset все поля и называть его:

@Override
public void onBackPressed() {
    getApplication().clearAllMyFields();
    super.onBackPressed();
}

Конечно, это поле не должно быть помечено как final или static final

Ответ 4

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

Значение будет сохраняться до тех пор, пока приложение не будет убито.

Не следует использовать System.exit(10), за которым следует Process.killProcess(Process.myPid()) для выхода из приложения?

Вы действительно должны думать о том, чтобы не выйти из приложения. Это не то, как обычно работают приложения Android.