Android中的Activity.finish()方法是如何工作的?

108
当一个Activity调用其finish()方法时,会发生什么?它会立即退出,还是会完成从中调用它的函数?

4个回答

125

它是立即退出还是完成调用它的函数?

调用了finish()方法的函数将一直运行直至完成。在Android将控制权返回之前,finish()操作甚至不会开始。


3
如何在不完成活动的情况下结束由StartActivityforResults()调用的活动? - Ayush Pateria
@CommonsWare 我们如何确保始终调用 onStop?在我的应用中,在某些情况下不会调用 OnStop 和 onDestroy,而在这些情况下,子活动需要太长时间才能完成,看起来像 App 已经挂起了... 然而,当调用 onStop 时,一切都正常。我使用 Android 2.3.6 上的 Galaxy y... 请查看我的问题:http://stackoverflow.com/questions/13928591/a-strange-behavior-of-android-activities-fragments-and-intent,请帮忙! - Amit
@NikhilAgrawal,你可以在调用finish()后立即使您的函数返回。 - antonio081014
如果该活动尚未暂停和停止,那么是的。 - CommonsWare
@CommonsWare 我正在以相同的方式执行,但Activity无法关闭。http://stackoverflow.com/questions/40233422/finish-activity-not-close-in-android-xamarin?noredirect=1#comment67730214_40233422 - Harshad Pansuriya
显示剩余2条评论

21

每个生命周期事件,如onCreateonResumeonPause......onDestroy都会在一个线程上调用 - 主线程。

简而言之,这个线程由队列支持,所有活动事件都会被投递到其中。此线程可以按插入顺序执行所有这些事件。

如果您在生命周期回调中之一(如onCreate())调用了finish(),则“finish”消息将添加到此队列中,但是线程不能自由地选择并执行“finish”操作,直到当前正在执行的方法返回即该线程被从当前任务中释放。


13

ondestroy()是在你的活动被销毁之前收到的最后一个调用。

这可能是因为活动正在完成(有人调用了finish()),或者因为系统正暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。


1
如果有两个活动A和B。并且您的流程从A> B;和B = A调用finish()
那么,调用finish()的方法将像Mark提到的那样执行。回调流程如下所示 -
  1. activity AonPause()
  2. Activity BonRestart()>onStart()>onResume()
  3. 然后,出现了真正的区别。如果您没有从activity A调用finish();则此处仅会调用Activity AonStop()。而在这种情况下,我们从Activity A调用了finish();因此,activity AonStop()onDestroy()都将被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接