7-Activity生命周期

生命周期图

在这里插入图片描述

正常情况

正常情况下,Activity会走如上图的生命周期。下面是对每个生命周期的简介。

onCreate

onCreate:表示Activity正在被创建,这是生命周期的第一个方法,在这个方法中,我们可以做一些初始化的操作。

可以进行的操作:比如调用setContentView去加载页面布局资源,初始化Activity的数据,注意的是虽然在onStart()中实现findviewbyid也可行,但我认为这没有必要,因为每次调用onStart()都会重新实例化view、控件。

一些特殊的初始化、变量的注册也不应当放在这里

而且onStart, onResume,onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时

onRestart

onRestart:表示Activity正在被重新启动。一般情况下,当当前Activity从不可见转换为可见状态时,onRestart就会被调用,这种情况一般是用户行为导致的。

可以进行的操作:可以在此方法中恢复需要展示Activity的数据

onStart

onStart:表示当前的Activity正在被启动,即将开始,这时候其实Activity已经可见了,但是还没有出现在前台,还无法和用户发生交互,这个时候的状态我们可以初步理解为Activity已经显示出来了,只是我们还看不到。

可以进行的操作:注册一些变量。这些变量必须在Android Activity类在前台的时候才能够被响应(或者这样说更明确,变量的注册更应当放在onCreate中,但是有些变量的注册必须在activity处于前台时才可行,这些则放在onStart中)。

onResume

onResume:表示当前Activity已经可见了,并且出现在了前台开始进行活动,当Activity将开始与用户进行交互时调用。在这个时间点你的活动将会在活动堆栈的顶端,用户输入将会访问它,要注意的是onResume和onStart的对比,两着都表示Activity可见,但是onStart的时候Activity还在后台,与用户无法发生交互,onResume的时候显示到前台,可以与用户发生交互。

可以进行的操作:调用一些刷新UI的函数,每当Activity调用到这里时就要刷新一下UI各控件的状态。

onPause

onPause:表示当前Activity正在停止,正常情况下,紧接着onStop会被调用,在特殊情况下,如果这时候快速的再返回到当前Activity,那么onResume会被调用,笔者的理解是这种情况属于极端情况,用户操作很难重现这一场景。

可以进行的操作:可以做一些存储数据,停止动画的操作,但是注意不能太耗时,因为这会影响到Activity的显示,onPause必须执行完毕,新Activity的onResume才会被执行。一般是做一些变量的设置,或者保存,因为这个时候Activity马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整。

onStop

onStop:表示Activity即将停止。

可以进行的操作:可以进行一些稍微重量级的回收工作,反注册在onStart函数中注册的变量,但是注意同样不能太耗时,需要注意的是在内存不足而导致系统无法保留此进程的情况下,onStop() 不会被执行。

onDestroy

onDestroy:表示Activity即将被销毁,这是Activity的最后一个回调。

可以进行的操作:反注册在onCreate函数中注册的变量,进行一些回收工作和最终的资源释放。

Activity在各个状态下的生命周期调用逻辑

  • 正常启动一个Activity:onCreate()—>onStart()—>onResume()

  • 按返回键返回finish一个Activity:onPause()—>onStop()—>onDestroy()

  • Activity显示是按home键:onPause()—>onStop()

  • 从home回到刚才的Activity:onRestart()—>onStart()—>onResume()

  • 从A跳转到B(A、B均为默认模式Activity):A的onPause()—>B的onCreate()—>B的onStart()—>B的onResume()—>A的onStop()

  • 从B返回到A:B的onPause()—>A的onRestart()—>A的onStart()—>A的onResume()—>B的onStop()—>B的onDestory()

  • 锁屏:onPause()—>onStop() 解锁:onRestart()—>onStart()—>onResume()

异常情况下的生命周期变换

异常结束包括Activity的状态改变和内存不足Activity被回收的情况。两种情况下的生命周期都遵循下面的情况。

  • Activity被异常结束:onPause()/onSaveInstanceState()—>onStop()—>onDestroy其中onPause和onSaveInstanceState没有固定的调用顺序

  • Activity从异常状态恢复:onCreate()—>onStart()—>onRestoreInstanceState()—>onResume()

其他启动模式下的生命周期变换

  • singleTop:如果A设置为singleTop,然后A启动自身时候生命周期是onPause()—>onNewInntent()—>onResume()
  • singleTask:第一次启动时候,和正常Activity启动的方式一样,当再次启动该Activity时候,生命周期是:上个Activity的onPause()—>onRestart()—>onStart()—>onResume()—>上个Activity的onStop()—>上个Activity的onDestory()。
  • singleInstance:和singleTask的生命周期方式一致。

各种生命周期适合进行的操作总结

  • onCreate:正常情况下,该方法只会执行一次。鉴于这种情况,在Activity生命周期内,只需要初始化一次的变量可以在这个方法中初始化。比如findViewById。

  • onStart:只有当Activity有不可见变为可见才回执行一次。由部分可见到完全可见不执行,比如Activityactivity开启了另一个不完全覆盖的activity B,而再次关闭这个B的时候,将不会执行这个方法,但是会执行onResume。所以适合做如下操作:播放一些在半覆盖情况下需要播放的动画, 部分控件的初始化操作,例如GPS

  • onResume:在activity获得焦点的时候执行,之后用户就可以和activity进行交互了,所以适合如下操作:与交互强相关的资源初始化,例如某些交互性较强的动画(比如下载进度)
    对相机资源的使用。

  • onPause:当系统调用此方法是,意味着Activity处于部分可见状态,也意味着用户正在离开这个Activity,通常应该在onPause()回调方法里面做以下事情:停止动画等浪费cpu资源的操作
    释放系统资源,比如BroadcastRecceivers、相机等,注意此处不宜执行耗时过长的动作,例如保存较大的数据到本地、持久化一些统计信息等。这样将会拉长onPause的时间,从而影响下一个Activity的启动

  • onStop:在onStop中,可以执行一些较为耗时的操作,例如:保存文本到本地,对一些调用频率较少的广播进行注销等操作,对在onStart注册的资源进行释放等

  • onDestory:activity在销毁前会执行的生命周期方法,这个方法执行后,activity就可能会被回收了。在onDestory中可以释放一些变量,特别是在onCreate中初始化,行进在整个生命周期内的变量例如:bitmap,bitmap的回收一直是android的一大问题,他的反复创建又比较耗费性能,如果在onStart中来创建,在onStop中来回收也不理想,如果这个页面需要经常切换,反而造成内存抖动,这种情况下,可以选择一直持有,在onDestroy中调用bitmap的recycle方法来回收。

总结:在onResume进行获取的资源适合在onPause中释放,这对方法中不适合耗时太长的方法。在onStart申请的资源对应的在onStop中释放,可以进行一些比较耗时的操作。onCreate和onDestroy中适合进行一些需要Activity长时间持有的资源的获取与回收,因为这俩方法在Activity的生命周期中只会调用一次。

注:资料参考自《Android开发艺术探索》