Activity详解——Activity生命周期整理

常见的各个生命周期介绍
onCreate()和onDestroy()
  • onCreate:表示Activity正在创建,是Activity生命周期的第一个方法。在这个方法中我们可以做一些初始化工作。比如加载布局资源,初始化数据等。
  • onDestroy:表示Activity即将被销毁,是Activity生命周期中的最后一个回调。我们一般在这里做一些回收工作和最终的资源释放
onStart()和onStop()
  • onStart:表示Activity正在被启动,即将开始。这时Activity已经是可见的,但是还没完全出现在前台,是不可交互的。或者可以理解为Activity已经在内存中绘制出来了,但是在界面上我们还看不到。
  • onStop:表示Activity即将停止,可以做一些轻量级的资源回收工作,注意耗时不能太长。
onResume()和onPause()
  • onResume:Activity已经可以被用户观察到,也可以和用户进行交互。这个和onStart状态相比Activity不只是可见的,而且是可交互的。
  • onPause:Activity正在停止,正常情款下下一个回调会是onStop。如果这个时候再回到当前Activity(比如singleTop模式时候自身启动自身),那么onResume会被调用。在这个方法中不宜进行耗时较长的操作,因为是此方法执行完后才回执行新页面的onResume所以耗时方法会让新页面显得卡顿
onNewIntent()

之前打开过得且还没有被销毁的Activity(既处于onPauseonStop状态),再次通过startActivity方式启动时候,会先调用该方法,然后在调用onResume。这种情况在Activity的默认启动方式时候不会出现。而在另外三种启动模式时候会出现。

在此方法中需要更新intent的值,否则intent的取值会一直是最开始启动该Activityintent值。

onSaveInstanceState()和onRestoreInstanceState()
  • onSaveInstanceState:在Activity被异常结束时候,会先调用这个方法,然后在调用onDestory()方法,在这个方法中可以做一些数据保存的逻辑,以方便Activity恢复时候进行必要数据的恢复。在这个方法中系统已经做了一定的数据保存工作,例如文本框用户输入的数据、ListView滚动的位置等,具体的实现可以查看每个View源码中的同名方法。
  • onRestoreInstanceState:在Activity从异常状态恢复时候,会在onCreate()之后调用,用来恢复onSaveInstanceState()方法中保存的数据
正常情况生命周期变换

Activity的主要生命周期间的切换模式可以用如下图所示的流程图来概括:

生命周期流程图

然后我们在来分情况说明下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其中onPauseonSaveInstanceState没有固定的调用顺序

  • 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的生命周期方式一致。
其他启动模式下的生命周期变换
  • 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的生命周期中只会调用一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值