美文网首页
Activity生命周期及启动模式

Activity生命周期及启动模式

作者: jiting45 | 来源:发表于2016-10-18 15:11 被阅读0次

    生命周期图,切勿眼高手低


    2H5V579BTWU(C$P(44YEG{I.png

    任务栈:程序打开时就开启了一个任务栈,用于记录用户开启的activity,先进后出。只有位于任务栈栈顶的activity才可以与用户交互。
    启动模式:
    1、standard:默认值,标准模式;当startActivity的时候就会创建实例,无论任务栈中是否已经存在了该实例。
    2、singleTop:栈顶复用模式,启动activity时,如果该activity位于栈顶,就直接复用该实例,不会再创建实例(不会调用该activity的onCreate、onStart,而是调用onNewIntent、onResume);如果该activity不位于栈顶,还是会创建该activity的实例。
    3、singleTask:栈内复用模式,启动activity时,首先会判断是不是存在需要的栈,如果不存在需要的任务栈,就会创建一个任务栈,并创建该activity的实例,压入该栈中;如果存在需要的栈,再判断该栈中是否存在该activity的实例,如果存在,就会将该activity上面的activity出栈,调用该activity的onNewIntent、onResume。如果该栈内不存在该activity的实例,就会创建该activity的实例,并压入栈中。判断是否存在需要的任务栈,就需要用到TaskAffinity,TaskAffinity就像是任务栈的身份证一样。
    4、singleInstance:单实例模式,加强的singleTask模式。启动activity时,会为该activity创建一个任务栈,之后再有别的页面启动该activity时,也不会创建该activity的实例。

    结合启动模式,查看一下activity的生命周期:

    1、ActivityA和ActivityB都是standard模式,在ActivityA上启动一个ActivityB:
    ![DP%7D5]]68PUIK72I]OJ5.png](https://img.haomeiwen.com/i2578759/abeaf109394ed9b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    按下home键,将应用置于后台,然后返回该应用:
    ![%329])@~RWL(YTD%9)3EP7H.png](https://img.haomeiwen.com/i2578759/6b2e385a4528f36d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    2、ActivityA为singleTop模式,在启动ActivityA后,再次启动ActivityA:

    2VV3MYHDLMEZ@)8MFTJHWUR.png
    按下返回键会直接退出ActivityA。
    3、ActivityA为standard模式,ActivityB为singleTask模式,ActivityC不是singgleInstance模式;在ActivityA中启动ActivityB,在ActivityB中启动ActivityC,在ActivityC中启动ActivityB:

    ![ZZPBDVC]$]WDN1Q4I)5C2W8.png](https://img.haomeiwen.com/i2578759/fc879a7a07d04a27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    ![]~CI8S{LN%K{3(W%W4]M%34.png](https://img.haomeiwen.com/i2578759/93373eb305a382e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    此时按返回键:

    V51O)BP41$92R)X0X8{MDH0.png
    4、横竖屏切换时候Activity的生命周期。**
    (1)、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
    (2)、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
    (3)、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    顺便记一下Activity的Flags:
    比较常用的标记位有:
    1、用于设定Activity的启动模式:
    FLAG_ACTIVITY_NEW_TASK:指定“singleTask”启动模式,效果和在Manifest指定一样
    FLAG_ACTIVITY_SINGLE_TOP:指定“singleTop”启动模式。
    2、用于影响Activity的运行状态:
    FLAG_ACTIVITY_CLEAR_TOP:具有此标记的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果该Activity的启动模式是singleTask,那么它上面的Activity会出栈,并执行该Activity的onNewIntent、onResume。如果该Activity是standard模式,那么该Activity和它上面的Activity都会出栈,系统会创建新的Activity实例并置于栈顶。
    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中;等同于在xml置顶属性:android:excludeFromRecents="true"。

    相关文章

      网友评论

          本文标题:Activity生命周期及启动模式

          本文链接:https://www.haomeiwen.com/subject/uvzayttx.html