Android Activity&Fragment生命周期探究
Activity&Fragment生命周期探究
Activity生命周期
Activity生命周期
流程
- onCreate 生命周期的第一个方法。进行Activity的初始化工作,包括setContentView,此时Activity还在后台,不可见,因此动画不应该在这里初始化
- onStart Activity已经可见了,但还未出现在前台,无法与Activity交互
- onResume Activity出现在前台且已经可见了,可以进行动画的开启
- onPause Activity准备跳转到另一个Activity或应用正常退出时执行。此时Activity可见。如果处于多窗口模式,已暂停的Actvity仍然可见。不应该在onPause中保存应用或进行网络数据请求、数据库事务等,因为在该方法完成之前,此类工作可能无法完成。应当在onStop中执行高负载的关闭工作
- onStop Activity已经不可见了,但对象还在内存中未被销毁
- onRestart Activity此时可见,用户从桌面切换回APP 或 从后一个Activity返回前一个Activity时
- onDestroy Activity进行销毁,不可见
当跳转Activity(A->B)时,方法的执行顺序
onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A). (A->B)
onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) -> onStop(B) ->onDestroy(B) (B-A)
注意这里为什么不是顺序执行而是交叉执行呢?
因为官方建议中,onPause方法将释放掉很多的系统资源,可能会占用一定时间,因此为保证流畅性,不采用顺序调用方法
- onSaveInstanceState 在onStop方法中调用
- onRestoreInstanceState 在onStart方法后调用
Fragment生命周期
主要流程说明
- onAttach Fragment与Activity建立关联时调用
- onActivityCreated 相关联的Activity的onCreate方法已调用时返回
- onDetach 点那个Fragment与Activity取消关联时调用
Activity与Fragment周期混合
考虑一个包含Fragment(F)的Activity(A)的启动流程时如何的
整体上,Activity与Fragment具有同步的生命周期,并且由于Fragment依附于Activity,因此相同生命阶段内总是Activity先于Fragment
onCreate(A) -> onAttach(F) -> onCreate(F) -> onCreateView(F) -> onViewCreated(F) -> onActivityCreated(F) -> onStart(A) -> onStart(F) -> onResume(A) -> onResume(F)
稍微深入
设置栈顶Activity的launchMode为SingleTop,此时再次启动,查看是否有变化?
onPause -> onNewIntent -> onResume
其实这里Activity为singleTop、singleTask、singleInstance都是一样的结果,会调用onNewIntent方法,可能会对Intent做一些处理
当launchMode为singleTask、singleInstance且存在该Activity相关实例时,从其他Activity跳转到该Activity*
onPause -> onNewIntent -> onRestart -> onStart -> onResume
弹出Dialog会发生什么
Activity调用onPause,因为此时Activity仍然是可见的
为什么Activity在onResume后才显示
从前面View绘制机制中能够了解到,onCreate方法中setContentView是把当前自定义布局通过layoutInflater添加到mContentParent中,但其实这一步只是加载好了布局,生成了ViewTree,并没有进行View到draw
Activity onResume方法会调用ActvityThread 的handleResumeActivity,此时就会进入我们熟悉的 WindowManager.addView,将view加入wm中并准备进行doTraversal的异步操作...
何时调用Activty的onCreate方法
通过LaunchActivityItem 调用 ActvityThread 的handleLaunchActivty方法,并最终调用Activity的onCreate
onCreate方法中写死循环,会导致ANR吗
不会