理解Activity生命周期的回调

    |     2015年4月21日   |   Activity活动   |     0 条评论   |    1657

Activity 生命周期可以想成一座金字塔:系统按台阶调用回调。新建实例时回调把状态往上推;到塔尖就是前台、用户可以交互。退出时再往下走,好回收资源。有时它会停在半山腰等着(切到别的 App),用户回来还能回到塔尖,并尽量恢复离开时的状态。


一、金字塔比旧生命周期图更好懂

Figure 1。这张图讲 Activity 生命周期(金字塔模型比早期 Dev Guide 里的图更形象):

basic-lifecycle

不一定要实现全部回调,但要知道每个方法干什么,App 才能按用户预期工作:

  • 来电或切到其它 App 时不要 crash。
  • 用户没在用某个组件时,不要空耗系统资源。
  • 离开一段时间再回来,不要丢掉进度。
  • 屏幕旋转时不要 crash,也不要丢进度。

二、三个能停得住的状态

图中各生命状态里,只有三个是静态的,Activity 可以在上面待比较久(其余很快切走):

  • Resumed:前台,用户可交互(常叫 running)。
  • Paused:被另一个 Activity 挡住——后者到了前台,但是半透明、没铺满。暂停的 Activity 不再接收输入,也不再执行界面相关代码(后台线程不一定停)。
  • Stopped:完全隐藏,用户看不见,相当于在后台。实例和状态信息还在,但不能执行代码。

Created 与 Started 都很短:系统很快跑完回调并进入下一态。也就是调用 onCreate() 之后迅速 onStart(),再迅速 onResume()。这就是基本生命周期。

状态 可见 / 可交互 会不会久停
Created / Started 过渡 否,立刻进入下一回调
Resumed 前台可交互 是
Paused 部分可见,不接收输入 是
Stopped 完全不可见 是(实例仍在)

三、七个回调与三层嵌套循环

void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

这七个方法定义完整生命周期,也可以看成三层嵌套循环:

完整生命周期:第一次 onCreate() 到 onDestroy()。在 onCreate 里设全局状态、完成初始化;在 onDestroy 里释放系统资源。例如后台下载线程:onCreate 创建,onDestroy 销毁。

可视生命周期:onStart() 到 onStop()。用户能在屏幕上看到它,即使不一定在前台交互。这两个方法之间适合保留「给用户看界面」所需的资源。例如在 onStart 注册 BroadcastReceiver 监控会影响 UI 的变化,onStop 里注销。可见性变化时 onStart / onStop 可能多次调用。

前台生命周期:onResume() 到 onPause()。此时在最上面与用户交互。休眠或新 Activity 启动会走 onPause;拿到结果或新 Intent 会走 onResume。暂停/恢复会非常频繁。

一句话总结:能久停的是 Resumed / Paused / Stopped;onCreate→onDestroy 管全局资源,onStart→onStop 管「看得见」,onResume→onPause 管「正在交互」。

转载请注明来源:理解Activity生命周期的回调
本文链接地址:https://ai.zhousir.top/?p=535
回复 取消