Android中Activity的生命周期

简介:

这个基本是必问的问题了,说一下你对Activity生命周期的理解,呵呵…

onCreate, onStart, onResume, onPause, onStop, onDestroy, onRestart这些大家都知道 如何回答的不落俗套,比格高呢…

先上一张完整的生命周期图吧: Activity/Fragment生命周期总结

分析:

那么为什么要弄这么多函数出来呢,主要是因为在Android中,应用间切换的需求比较频繁,这么做主要是为了适应这种场景。比如两个Activity来回切换会有如下工作要做:

  1. 所有个静态初始化工作,此时view还不存在,需要创建view,绑定数据;提供之前封存的状态;(onCreate)
  2. 显示给用户(onStart)
  3. 开始与用户交互,显示动画,打开独占资源;(onResume)
  4. 保存所有的为保存数据,停止动画以及所有的耗CPU资源操作;提交在用户离开时期待保存的内容(例如邮件草稿);释放独占资源(以防下一个App使用);(onPause)
  5. 一些不适合放在onPause中做的工作(heavy-load)(onStop)
  6. 释放App关联资源,比如onCreate创建的线程,停止Trace收集,保证App终止时没有泄漏资源(onDestroy)

如果把这些所有启动动作都放在一个函数,比如onStart中明显是不合理的: 如果这两个Activity分别称为AAty和BAty,从A切换到B再切换到A,onCreate中的动作明显不需要再做了,所以必须要独立出来放到onCreate中,以便碰到这种情况的时候不执行onCreate;另外如果在onStart中显示动画显然也是不合理的,因为Activity在当时还不可见,所以把onResume独立出来。停止的过程则反之。

原则:

  1. onCreate里面尽量少做事情,避免程序启动太久都看不到界面
  2. onStart()方法是一个来验证某些必须的系统特性是否可用的比较好的地方。
  3. onPause()并不是Activity是否可见的最好指示器,有可能有keyboard在前台,应使用 onWindowFocusChanged(boolean) 做判断。
  4. 如果对应的onPause()在500ms内还没有执行完,ActivityManagerService就会强制关闭这个Activity.所以不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储(File或者DB)上,而放到onStop中来加快切换速度。
  5. 几乎所有Activity的子类,都会实现onCreate和onPause这两个方法
  6. 不应该使用onDestroy保存数据,比如对content provider的保存应该在onPause或者onSavedInstanceState中进行,因为极端情况下,系统会直接杀死我们的app进程,并不执行activityonDestroy()调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏。

问题:

1. 切换过程为什么一定是A:onPause()->B:onCreate()->A:onStop()呢

如果不执行A:onPause()来释放独占资源,B根本无法使用。 先执行B:onCreate()最后再执行A:onStop()是为了尽快让B进入可交互状态,提升用户体验,onStop中一些耗时操作可以在可交互以后慢慢执行。

参考:

  1. Activity/Fragment最强生命周期总结
  2. Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
原文地址:https://www.cnblogs.com/dracohan/p/5967547.html