2013-03-21 2 views
16

Сценарий:

Я четыре мероприятия в моем Android Application, позволяет сказать, что 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 (на спине нажатой).Что происходит, когда заканчиваются все действия приложения?

Вопросы:

  1. Будет отделка всех действий по телефону закончить() каждый вид деятельности будет закрыть приложение (его процесс)?
  2. Как значение переменной сохраняется, даже если все ее действия закончены (закрыты)?
  3. Справедливо ли звонить по телефону System.exit(10), а затем Process.killProcess(Process.myPid()) для выхода из приложения?

Update:

Как очистить константы приложения на выходе из приложения (Назад в пресс HomeActivity)?

+1

Константы по определению не меняются, так зачем беспокоиться об их очистке? – m0skit0

+0

Прост: не вызывать 'System.exit()' (не рекомендуется вообще, как обсуждалось в SO). Просто очистите переменные, когда HomeActivity будет завершена. –

ответ

14

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

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

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

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

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

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

Quotes source

+1

Я также где-то читал, что андроид решает, когда убить процесс –

+0

@nidhi_adiga, вот что я сказал: * «Это зависит от ОС, чтобы решить, прекратить ли это процесс». * – m0skit0

+0

Просто для уточнения: * * ОС «Я имею в виду Android ofc. – m0skit0

5

Будет завершение всех мероприятий по телефону закончить() каждый вид деятельности будет закрывать приложения (его процесс)?

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

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

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

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

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

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

Хотя это убьет приложение, оно не рекомендуется. См. Вопрос this по целому ряду причин.

+1

+1 за предоставленную ссылку и пояснения. – Raghunandan

0

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

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

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

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

2

для обновления:

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

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

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

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

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

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

Смежные вопросы