跳至主要內容

Android Activity&Fragment生命周期探究

PPLong大约 3 分钟

Activity&Fragment生命周期探究

Activity生命周期

Activity生命周期

Android Activity生命周期图
Android 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生命周期

Fragment生命周期
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与Fragment生命周期同步
Activity与Fragment生命周期同步

稍微深入

设置栈顶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吗

不会