Activity的生命周期和启动模式

  • Activity的生命周期

activity的生命周期很简单,盗取官网的一个经典的图

activity_lifecycle.png

上面的这张图基本上每一个Android的开发者都知道,其中只有三个状态是常态,其余的都是过度状态。 这个三个状态是onResume(此时的的activity位于任务栈的栈顶,可以和用户进行交互), onPasue(此时的状态是是activity的被遮住了一部分,比如说弹出了一个dailog,但是不可以和用户进行交互), onStop(此时的状态已经被完全覆盖,用户看不到,仅在后台运行)

  1. Activity的启动与销毁过程.

当你调用了startActivity,系统立刻调用onCreate方法, 接着调用onStart()方法,然后继续调用onResume方法,停留在活动的状态,这个时候是可以响应交互的。当此activity部分不可见的时候,就会调用onPause()方法,进入暂停状态,当activity完全不可见的时候就会调用onStop()方法,此时的activity的不会在栈顶,对于用户来说完全不可见,并当系统资源紧张的时候会回收此activity,并调用onDestroy()方法。 如果你你是手动的返回或者调用finish()方法,系统就会从pasue状态一直调用到ondestroy

  1. onSaveInstanceState() 和onRestoreInstanceState()

如果系统长期处于stop状态,并系统资源紧张的时候,系统会回收资源(你的activity),而此时系统为了补偿你会调用onRestoreInstanceState(Bundle savedInstanceState),这个方法中有一个bundle对象, 你可以添加键值对存入bundle对象,用来保存你需要的数据。 当你需要重新创建activity的时候,保存的Bundle对象会传递到onCreate 和onRestoreInstanceState这个两个方法中,所以你可以从这两个方法中的任意一个获取你保存的数据,用来恢复你需要的某些状态。onRetoreInstanceState()在onSave()方法之后调用

  • Activity的启动模式

一个Android应用程序会有多个activity用来显示各个界面,activity之间用intent进行连接,Android系统用栈这种先进后出的结构来保存activity。当一个APP启动的时候,如果当前的环境中不存在改APP的任务栈,系统会创建一个任务栈,此后这个APP所启动的activity都会存入到这个栈中,这个栈也被称为一个Task。 值得注意的是一个Task中activity可能来自不同的APP,同一个APP中的activity也可能不在一个Task中。根据activity在栈中的位置来决定activity的状态。 当启动一个activity的时候,存入Task,位于栈顶处于活动状态,启动他的activity的如果没有调用finsh()的话依然在栈中,栈顶的activity按了返回或者调用了finish的话,栈顶的activity就会销毁并移除,下面的activity又重现了。当然系统不可能总是这么简单,所以设置了一些启动模式来改变这种正常的状态,就是在AndroidMainfest文件activity的属性android:lanuncheMode来设置。

一共有四种不同的启动模式 standard, singleTop, singleTask,singleInstance

  1. standard: 默认启动模式。 这中启动模式每次创建都会创建新的实例存入栈中,即使栈顶已经是你要创建的activity也会在创建一个放入栈顶,所以你必须回退两次才能退出。

  2. singletop。 如果是这种模式的创建的activity,系统会先判断当前任务栈的栈顶是不是该activity,如果是改activity的话,系统不创建直接饮用这个activity,如果不黄是则创建。

  3. singleTask。 singleTask域singleTop类似,只不过singleTop检测的是栈顶,而singleTask检测的是整个任务栈。值得注意的是如果栈中有这个activity,把activity移到栈顶的时候,这个activity之上的所有activity都会出栈被销毁,当然这里指的是同一个APP中启动这个activity,如果不同的APP来启动的话,那么会创建一个新的任务栈。 有一点需要注意的是如果启动模式为singleTask的activity已经在后台的一个任务栈中了,那么启动后,后台的任务栈将会切换到前台。 需要注意的是如果此模式下又设置了android:taskAffinity="栈名",栈名不和你APP的包名相同的话,会单独创建一个栈来存放次activity或者存放到名字相同的任务栈中

  4. singleInstanace: 单例模式。 这是一种加强的singleTask模式,这种启动模式的activity会位于一个单独的任务栈中。

  5. 需要注意的是 singleTop, singleTask,singleInstance 这个三种启动模式第二次启动的时候会调用oonNewIntent(Intent intent)这个方法,这个方法中有一个参数intent用来接收启动的时候传递过来的参数

  6. 以上只是在任务文件中配置,方然也可以在程序中指定(intent.setFlags()):

  • Intent.FLAG_ACTIVITY_NEW_TASK 使用一个新的任务栈来存放activity应该和singleInstance类似

  • Intent.FLAG_ACTIVITY_SINGLE_TOP 相当于singleTop

  • Intent.FLAG_ACTIVITY_CLEAR_TOP 清空栈顶,和singleTask相同

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

推荐阅读更多精彩内容