Activity的生命周期以及Activity的launchMode

一、Activity的生命周期

1.Activity生命周期中的重要方法

(1)、onCreate():表示Activity已经被创建。这是Activity生命周期中的第一个方法,Activity生命周期只执行一次,可以在这个方法里做一些初始化工作,比如setContentView加载布局资源,初始化Activity所需要的数据等

(2)、onReStart():表示Activity重新被启动。该方法可以被执行多次,之后紧跟着onStart()。一般是Activity从不可见变为可见时调用。比如:Activity界面按home键或者重新打开一个新的Activity,当前Activity就会停止,执行onPause()和onStop()方法后,用户又回到当前Activity时会被调用。

(3)、onStart():表示Activity已经创建完成,正在被启动。这个方法表示Activity已经是可见状态,但是没有出现在前台,用户看不到,所以还不能和用户进行交互。该方法可以被执行多次,一般是重现启动时,在onReStart()后面被调用.

(4)、onResume():表示Activity已经可见了。该方法说明Activity已经在前台显示了,用户可以看见了,并且交互了。该方法可以被执行多次。

(5)、onPause():表示Activity正在停止,紧接着执行下面onStop()方法。此时可以做一些数据存储、动画停止的任务。不能做太耗时任务,会阻塞UI线程的,影响Activity的显示。该方法适合onResume()相对的。该方法可以被执行多次。

(6)、onStop():表示Activity即将停止。此时可以做一些轻量级资源回收的工作,单不能太耗时。该方法适合onStart()相对的。该方法可以被执行多次。

(7)、onDestory():表示Activity即将被销毁。这是Activity生命周期中的最后一个方法,Activity生命周期中只执行一次,该方法适合onCreate()相对的。可以在该方法中做资源的最终回收已经释放。

(7)、onReStart():表示Activity重新被启动。该方法可以被执行多次,之后紧跟着onStart()。一般是Activity从不可见变为可见时调用。比如:Activity界面按home键或者重新打开一个新的Activity,当前Activity就会停止,执行onPause()和onStop()方法后,用户又回到当前Activity时会被调用。

2、Activity的生命周期


(1)第一次启动Activity,回调如下:onCreate-->onStart-->onResume。

(2)当用户打开新的Activity或者回到桌面时,回调:onPause-->onStop(如果新的Activity是透明主题的话不会回调onStop)。

(3)用户回到原Activity时,回调如下:onRestart-->onStart-->onResume.

(4)退出Activity是,回调如下:onPause-->onStop-->onDestroy.

(5)当Activity被回收后,重新打开Activity时,是重新创建了Activity,回调和(1)一样。

备注:有错误的地方,还望指正,共同进步。

二、Activity的launchMode

(1)、standard:系统默认的启动模式。Activity在AndroidManifest中不设置launchMode属性时,系统就会以standard的模式启动Activity。该模式的Activity,每启动一次就会创建一个新的实例,放到Activity的任务栈里,不管该Activity是否存在。

(2)、singleTop:栈顶复用模式。该模式下,新的Activity启动时,如果在Activity的任务栈中已经有该Activity的实例,并且位于栈顶,那么新的Activity就不会被重新创建,而是复用栈顶的Activity,同时回调栈顶Activity的onNewIntent方法。如果任务栈中该Activity的实例不位于栈顶或者没有该Activity的实例,则创建新的Activity实例。

比如:Activity任务栈中有3个Activity实例A-B-C,Activity B和C的模式是singleTop。

       1、如果再次启动C时,系统就不会创建Activity C的实例,而是直接调用Activity C的onNewIntent方法。此时任务栈中Activity实例是:A-B-C。

       2、如果再次启动B时,由于B不位于栈顶,系统就会重新创建B的实例。此时任务栈中Activity的实例是:A-B-C-B。

(3)、singleTask:栈内复用模式,该模式是一种单例模式。在这种模式下,只要Activity在一个任务栈中存在,那么不管启动多少次该Activity都不会重新创建新的实例,而是回调onNewIntent方法。该模式还带有clearTop效果,会把任务栈位于该Activity实例之上的所有Activity实例全部出栈。

比如:Activity任务栈S1中有3个Activity实例A-B-C,B的模式是singleTask,新的Activity实例D也是singleTask模式。

       1、如果启动D,并且压入到任务栈S1中。则创建新的实例D,压入到S1中。此时S1中Activity的实例是:A-B-C-D。

       2、如果启动的是实例B的话,并且压入到任务栈S1中。则不会创建新的实例B,而是直接回调S1栈中的实例B的onNewIntent方法,并且把栈中实例B之上的C出栈。此时S1中Activity的实例是:A-B。

      3、如果启动的是实例B的话,并且压入到任务栈S2中。系统就会查找有否存在S2,如果不存在,就创建S2,并不B压入到S2,此时任务栈实例:S1任务栈{A-B-C}、S2任务栈{B}。如果S2存在,就查看S2中是否有实例B。若S2中不存在B,则创建并压入S2任务栈中。若S2中存在B,则直接回调栈中的实例B的onNewIntent方法,并把栈中B之上的实例出栈。

(4)、singleInstance:单实例模式。是singleTask的升级版,不但包含了singleTask模式的特性外,还具有有一点,只能单独位于一个任务栈中。该模式的Activity第一次被启动时,系统会为该Activity创建一个新的任务栈,该Activity独自在这个任务栈中。由于站内复用特性,后续不会创建新的该Activity实例。除非这个任务栈被销毁。

三、Intent Flags(或者Activity的Flags)

Flags:表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系。Flags优先级高于AndroidManifest中的LaunchMode属性。如果Activity A在AndroidManifest中设置了LaunchMode属性,而且在启动A时有添加了Flags标志位,则已Flags标志位为准。

以下介绍几种常见的Flags:

(1)、FLAG_ACTIVITY_NEW_TASK 

当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主

FLAG_ACTIVITY_SINGLE_TOP

这个FLAG就相当于启动模式中的singletop,例如:原来栈中结构是A B C D,在D中启动D,栈中的情况还是A,B,C,D。

FLAG_ACTIVITY_CLEAR_TOP

这个FLAG就相当于启动模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity,之后的一篇博文里面会提到)

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思!比如说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式启动,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B。如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。

那么系统如何区分让当前activity退到background时使用是用户的选择?

它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的。

注意:调用finish()使该activity销毁时不会调用该函数

FLAG_ACTIVITY_NO_HISTORY

意思就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,比方说!原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。


备注:有错误的地方,还望指正,共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容