Как Activity.finish () работает в Android?


108

Может ли кто-нибудь дать описание того, что происходит, когда метод Activityвызывает свой finish()метод?

Он немедленно завершает работу или выполняет функцию, из которой был вызван?


Ответы:


123

Он немедленно завершает работу или завершает функцию, из которой был вызван?

Вызванный метод finish()будет выполнен до конца. finish()Операция не будет даже начинать , пока не возвращает управление Android.


3
Тогда как завершить действие, которое вызывается StartAvtivityforResults () без завершения?
Ayush Pateria

@CommonsWare Как обеспечить постоянный вызов onStop? В моем приложении OnStop и onDestroy в некоторых случаях не вызываются, и в этих случаях дочерняя активность занимает слишком много времени для завершения, и это выглядит так, как будто приложение зависло ... Тогда как при вызове onStop все работает нормально. Я использую Galaxy y с Android 2.3.6 ... см. Мой вопрос на stackoverflow.com/questions/13928591/…, пожалуйста, помогите !!!
Амит

@CommonsWare Я проверил, сэр, очень верно. +1 для вас Но я хочу задать один вопрос. Я написал finish () в качестве первого оператора в моей функции, тогда он выполняет всю функцию, а затем вызывается finish () Как это удалось.
Nikhil Agrawal

@NikhilAgrawal, вы можете вернуть функцию сразу после вызова finish ().
antonio081014

Вызывает ли finish () также onPause () и onStop () перед вызовом onDestroy ()?
sr09

20

Каждое событие жизненного цикла , как onCreate, onResume, onPause.... onDestroyиз деятельности всегда вызываются в одном потоке - «главная нить».

Короче говоря, этот поток поддерживается Очередью, в которую отправляются все события активности. Этот поток может выполнять все эти события в порядке вставки.

Если вы вызываете finish()один из обратных вызовов жизненного цикла, например onCreate()... сообщение «завершения» будет добавлено в эту очередь, но поток не может выбрать и выполнить действие «завершения» до тех пор, пока выполняемый в данный момент метод не вернется, т.е. поток не будет освобожден от текущая задача.


13

ondestroy() это последний звонок, который вы получите перед тем, как ваша деятельность будет уничтожена.

Это может произойти либо из-за того, что действие завершается (кто-то вызвал finish() его, либо из-за того, что система временно уничтожает этот экземпляр действия для экономии места. Вы можете различить эти два сценария с помощью isFinishing() метода).


1

Если есть два действия A и B. И ваш поток идет от A> B; и B = A звонит finish().

Затем,

Метод, из которого вы вызывались, finish()будет выполняться, как упомянул Марк. И поток обратных вызовов будет следующим -

  1. onPause() из activity A
  2. onRestart()> onStart()> onResume()АКТИВНОСТИ В
  3. Затем наступает настоящая разница. Если вы не звонили finish()из activity A; здесь будет называться только onStop()из Activity A. Хотя, в данном случае, когда мы назвали finish()из Activity A; Так onStop()и onDestroy()будут востребованы оба activity A.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.