Activity的生命周期和启动模式

一、Activity的生命周期

1、典型情况下的生命周期

(1)onCreate

    表示activity正在被创建,生命周期的第一个方法,我们可以在这里面去做一些初始化的工作。比如加载界面布局等等。

(2)onRestart

    activity正在重新启动,由不可见状态变为可见状态。一般调用了onStop之后,再回到这个activity,就会调用onRestart.

(3)onStart

    表示activity正在被启动,这个时候acitvity已经可见了,但是没有出现在前台,无法进行交互,可以理解为activity已经显示出来了但是用户看不到。

(4)onResume

    表示activity已经可见了,并且出现在前台。注意:onStart和onResume都表示activity已经可见,但是onStart的时候activity还在后台,onResume才显示到前台。

(5)onPause

    表示activity正在被停止,正常情况下,紧接着onStop就会被调用。在特殊情况下,如果快速返回到当前的activity,那么onResume就会被调用(极端情况).这个时候可以做一些存储数据,停止动画的工作,但是注意不能太耗时,因为这会影响到新的activity的显示,onPause必须先执行完,新activity的onResume才会执行.

(6)onStop

    表示activity即将停止,这时可以做一些扫尾重量级的工作,但是同样不能太耗时.

(7)onDestroy

    表示activity即将销毁,activity生命周期的最后一个回调.在这里我们可以做一些回收工作和最终的资源的释放.

这里写图片描述

(8)注意

    (1)activity第一次启动,回调如下:onCreate->onStart->onResume.如果activity被系统回收了再次打开,回调也是这样的.
    (2)当用户打开了新的activity或者回到桌面时.回调如下:onPause->onStop.如果新activity采用了透明的主题则不会回调onStop.
    (3)当用户回到原来的activity时,回调如下:onRestart->onStart->onResume.
    (4)当用户按back键回退时:回调如下:onPause->onStop->onDestroy.
    (5)从整个生命周期来说,onCreate和onDestroy是配对的,标志着activity的创建和销毁.并且只会调用一次.从activity是否可见来说,onStart和onStop是配对的,这2个方法可能会被多次调用.从activity是否在前台来说,onResume和onPause是配对的,也可能会被多次调用.

2、异常情况下的生命周期

    (1)切换横竖屏时.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.同时由于activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法是在onStop之前执行的,但是和onPause没有太大的时序关系.这个方法只会出现在activity被异常终止的情况下.activity被重新创建后,系统会调用onRestoreInstanceState,并把activity销毁时调用onSaveInstanceState方法所保存的Bundle对象传给onRestoreInstanceState和oncreate方法.我们可以根据这个来判断activity是否被重建.onRestoreInstanceState出现在onStart之后.
    设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.
    设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.
    (2)资源内存不足导致低优先级的activity被系统杀死.这个时候它的数据的保存和恢复情况与上面的基本一致.

二、Activity的启动模式

(1)、activity的launcherMode

    默认情况下,当我们多次启动同一个activity时,系统是用栈(后进先出)来存储这些activity实例的,当我们单击back键时就会有一个activity出栈,知道最后一个activity出栈,系统就会回收这个栈.接下来我们介绍activity的4种启动模式:standard(默认启动模式),singleTop,singleTask,singleInstance.

(1)standard

    默认启动模式,每次启动activity都会重新创建一个实例,这是一种典型的多实例实现,一个栈中可以有多个实例,每个实例也可以属于不同的栈,在这种模式下,谁启动了这个activity,那么这个activity就运行在启动它的那个activity所在的栈中.

(2)singleTop

    栈顶复用模式,这种模式下,如果新的activity处于栈顶,那么就不会被重新创建,同事它的onNewIntent方法会被回调,如果不是位于栈顶时,则和standard模式一样.

(3)singleTask

    站内复用模式,这是一种单例模式,这种模式下,只要activity在一个栈中存在,那么多次启动这个activity都不会重新创建实例.而是和singleTop一样,会调用他的onNewIntent方法.具体来说,当一个具有singleTask模式的activity请求启动后,比如activity A,系统首先会寻找是否存在activity A想要的栈,如果不存在则重新创建一个栈,然后创建activity A的实例,并放入栈中.如果有activity A所需要的栈,则看栈中是否有activity A的实例,如果实例存在,那么系统就会把activity A上面的其他实例出栈,将activity A放在栈顶并调用它的onNewIntent方法,如果栈内没有activity A的实例,就创建一个activity A的实例,并压入栈中.

(4)singleInstance

    单实例模式,一种加强版的singleTask模式,除了具有singleTask模式的所有特性外,还加强了一点,就是具有这种模式的activity只能单独的位于一个栈中,意思就是,例如activity A是这种模式,那么当activity A启动时,系统会为它创建一个新的任务栈,然后activity A的实例肚子在这个栈中.后面在启动这个activity都不会创建新的activity A的实例,除非这个栈被系统销毁了.

(5)注意

    (1)我们曾多次的提到了栈,那么什么是Activity所需要的栈呢?这首先重一个参数说起TaskAffinity(任务相关性),这个参数标识了一个activity所需要的栈的名字,默认情况下所有的activity的所属的栈名都是它应用的包名,当然我们可以通过TaskAffinity来给activity来指定栈名,不能和包名相同,不然就没有意义了.TaskAffinity属性主要还是和singleTask启动模式和allowTaskReparenting属性配对使用,在其他情况下没有意义.另外栈分为前台任务栈和后台任务栈,后台任务栈的activity位于暂停状态.
    当TaskAffinity与singleTask启动模式配对使用时acitvity会运行在名字和TaskAffinity形同的任务栈中.
    当TaskAffinity与allowTaskReparenting属性结合的时候比较复杂,暂时不讨论

    (2)如何给activity指定启动模式呢?有2种方法,1、在manifest中指定

这里写图片描述
1、通过在Intent中设置标志位来指定
这里写图片描述
第二种的优先级要高于第一种,如果同时存在的话,以第二种为准.而且第一种无法为activity设定FLAG_ACTIVITY_CLEAR_TOP标志,第二种无法指定activity singleInstance模式.

(6)Activity的Flags

    FLAG_ACTIVITY_NEW_TASK,指定为singleTask启动模式.
    FLAG_ACTIVITY_SINGLE_TOP,指定为singleTop启动模式.
    FLAG_ACTIVITY_CLEAR_TOP,具有此标志的activity,当它启动时同一个栈中位于它上面的activity实例都要出栈,这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用,在这种情况下,被启动的activity如果已经存在那么就会调用他的onNewIntent方法,如果被启动的activity采用的是默认的启动模式那么它连同它之上的activity都要出栈,系统会创建新的activity实例并放入栈顶.singleTask启动模式默认就具有此标记的效果.
    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,具有这个标志的activity不会出现在历史activity列表里面,等同于在manifest中指定activity的属性android:excludeFromRecents="true".
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值