Activity生命周期和启动模式

1. 典型情况下的生命周期分析

  1. 完整生存期:onCreate()-onDestory(),分别标识着Activity的创建和销毁,并且只可能有一次调用。

  2. 可见生存期:onStart()-onStop(),随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

  3. 前台生存期:onResume()-onPause(),随着用户操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

当用户按下back键回退时,回调如下:onPause()-onStop()-onDestory()。

假设当前Activity为A,这时用户打开一个新的Activity B,那么此时的生命周期回调顺序为:

I/A: onPause()
I/B: onCreate()
I/B: onStart()
I/B: onResume()
I/A: onStop()

因为必须onPause执行完成以后新Activity才能onResume,所以不能在onPause和onStop中做重量级操作,尤其是onPause,这也意味着,我们应当尽量在onStop中做操作,而使得Activity尽快显示出来并切换到前台。

2. 异常情况下的生命周期分析

2.1 情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建

当Activity在异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机在onStop之前,他和onPause没有既定的时序关系,既可能在onPause之前也可能在其之后。

当Activity被重建后,系统会调用onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果是,就取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStrat之后。

关于保存和恢复View层次结构,系统的工作是这样的:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶层容器去保存数据,顶层容器是一个ViewGroup,最后顶层容器再去一一通知他的子元素保存数据,这样整个数据保存工作就完成了。

onSaveInstanceState和onCreate的区别

  1. onSaveInstanceState一旦被调用其参数Bundle savedInstanceState一定是有值的,我们不用额外判断它是否为空。
  2. 如果onCreate正常启动的话,参数Bundle savedInstanceState值为null,所以必须额外判断。
  3. 这两个方法都可以进行数据恢复,但是建议使用onSaveInsatnceState去恢复数据。

2.2 情况2:资源内存不足导致低优先级的Activity被杀死

Activity按照优先级从高到低,可以分为如下三种:

  1. 前台Activity:正在和用户交互的Activity,优先级最高。
  2. 可见但非前台Activity:比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法与用户直接交互。
  3. 后台Activity:已经暂停的Activity,比如被执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上述的优先级去杀死目标Activity所在的进程,并在后期通过onSaveInstanceState和onRestoreInstanceState来存储恢复数据。

如果一个进程没有四大组件在执行,那么这个进程很容易被系统杀死。

比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易被系统杀死。

如果当某项内容发生改变后,我们不想系统重新创建Activity,可以给Activity指定configChanges属性

比如不想让Activity在屏幕旋转时重新创建Activity,就可以给configChanges属性添加orientation这个值。

android:configChanges="orientation"

3. Activity的启动模式

3.1 Activity的LaunchMode

  1. standard:标准模式,也是默认模式,每次启动一个Activity都会新建一个新的实例

  2. singleTop:栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,那么Activity不会被重建,同时他的onNewIntent方法也会被回调,通过此方法的参数我们可以读取出当前请求的信息。

  3. singleTask:栈内复用模式,这是一种单例模式,只要Activity在一个栈中存在,那么多次启动Activity都不会创建实例。

    比如目前任务栈S1中的情况为ABC,这时候Activity D以singleTask模式请求启动,其所需要的任务栈为S2,由于S2和D的实例均不存在,所以系统会县创建任务栈S2,然后再创建D的实例并将其入栈到S2。

  4. singleInstance:这是一种加强的singleTask模式,此模式的Activity只能单独的位于一个任务栈中

3.2 指定启动模式

有两种方法,一种是通过AndroidMenifest.xml文件指定,一种是通过在Intent中设置标志位来为Activity指定启动模式

第一种方式

<activity android:name=".MainActivity"android:launchMode="singleTask"android:configChanges="orientation">

第二种方式

Intent intent=new Intent(MainActivity.this,MainActivity2.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

区别

  1. 第二种的优先级要高于第一种,当两种同时存在时,以第二种为准。

  2. 两种方式在限定范围上有所不同,第一种无法直接为Activity设置FLAY_ACTIVITY_CLEAR_TOP标识,第二种无法指定singleInstance模式。

3.3 Activity中的Flags

  1. FLAG_ACTIVITY_NEW_TASK:指定Activity为singleTask启动模式
  2. FLAG_ACTIVITY_SINGLE_TOP:指定Activity为singleTop启动模式
  3. FLAG_ACTIVITY_CLEAR_TOP:具有此表即位的Activity,当他启动时,在同一个任务栈中所有位于他上面的Activity都要出栈,一般与FLAG_ACTIVITY_NEW_TASK配合使用

4. IntentFilter的匹配规则

IntentFilter中的过滤信息有action、category、data。

4.1 action匹配规则

action的匹配规则是Intent中的action必须能够和清单文件过滤规则中的action匹配,这里指字符串值完全一样。

一个过滤规则可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。

如果Intent中没有指定action,那么匹配失败。

4.2 category匹配规则

category他要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个相同。

换句话说,Intent中如果出现了category,不管有几个category,对于每个category来说,他必须是过滤规则中的存在的category。

Intent中可以没有category,也可以匹配成功,原因是系统在调用satrtActivity或者startActivityForResult的时候会默认为Intent加上"android.intent.category.DEFAULT"这个category,可以与过滤规则中匹配。

所以为了能够接受隐式调用,就必须在intent-filter过滤规则中指定"android.intent.category.DEFAULT"这个category。

4.3 data匹配规则

data匹配规则与action类似,如果过滤规则中定义了data,那么Intent中也必须要定义可匹配的data。

data的语法如下所示:

<data android:scheme="URL模式"android:host="主机名"android:port="端口号"android:path="路径信息"android:pathPattern="路径信息"android:pathPrefix="路径信息"android:mimeType="媒体类型"></data>

如:

<data android:scheme="file"android:host="www.baidu.com"></data>

Activity生命周期和启动模式相关推荐

  1. 安卓学习笔记06:Activity生命周期与启动模式

    文章目录 零.学习目标 一.Activity生命周期 1.了解Activity生命周期 2.Activity生命周期简化图 (1)Activity存在与否 (2)Activity可见与否 (3)Act ...

  2. Activity生命周期及启动模式详解

    1.Activity生命周期 1.正常情况: (1) onCreate: 表示 Activty 正在被创建,这是 Activity 生命周期的第一个方法,可以做一些初始化的工作,比如:加载布局,绑定控 ...

  3. Activity详解Activity的使用步骤、生命周期及其启动模式、启动方法

    开始我们先来回顾一下Activity的基础知识: Activity是应用程序的表现层,应用程序中可以包含多个Activity,它们之间可以相互跳转,来达到手机屏幕的切换.Activity通过View来 ...

  4. Activity的生命周期和启动模式--Activity的生命周期的全面分析

    本节将Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期.所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity所经过的生命周期的改变 ...

  5. Android开发艺术探索笔记(一) Activity的生命周期和启动模式(1)

    Activity作为Android开发中最常用的一个组件,是Android开发人员必须熟悉且掌握的重要内容.同时Activity也是在面试中经常被问到的一个方向.因此,掌握Activity的重要性也不 ...

  6. 第一章: Activity的生命周期和启动模式:

    1.典型情况下的Activity的生命周期 1.1 所谓的典型情况下的Activity的生命周期,是指用户参与的情况下.即用户正常使用app应用的时候正常执行的activity的生命周期. 1.2 在 ...

  7. Activity生命周期Android,横屏切换不重新创建Activity, Activity的四种launchMode

    Activity生命周期 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态. 2.当前Activity被其 ...

  8. Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数

    探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...

  9. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

最新文章

  1. 回收站功能在 Linux 中的实现
  2. python从字符串解析方法名
  3. mysql的常用内置函数
  4. spotlight soo5072:there was an error reading the tnsnames.ora
  5. vue-property-decorator使用指南
  6. JS判断字符串变量是否含有某个字串的方法
  7. 在html中代码规范是哪个键,HTML代码规范经验
  8. 桌面没有计算机图标6,我的电脑图标没了怎么办
  9. LOJ 6278 数列分块入门2
  10. leetcode刷题日记-leetcode刷题日记-71. 简化路径
  11. 思路清晰的软光栅小引擎和四元数结合案例
  12. 校友会小程序开发笔记十八:为浏览记录(我的足迹)模块的设计与实现
  13. 自定义 Drawable实现灵动红鲤鱼特效
  14. Edge上的gmail网页改为纯文字模式后改不回标准模式(HTML Gmail)问题和解决方法
  15. Android 手机自动化测试工具有哪几种?
  16. 【牛客】链表的回文结构
  17. windows11如何去桌面快捷键小箭头的方法
  18. 自动化测试遇到的难题_自动化内容难题
  19. Codeforces 1034 A
  20. 今日金融词汇--- 高杠杆模式

热门文章

  1. 琐碎的知识点(xly)
  2. JDBC连接池c3p0连接异常和日志处理
  3. “透视HTTP协议”之破冰篇个人总结
  4. 蓝光播放器中应用的触摸芯片
  5. ECharts饼图lengend点击事件处理
  6. alin的学习之路:面试题 数据库相关
  7. iphone6s计算机驱动,教你iphone6s连接电脑出现驱动问题怎么办及iOS9.0.2 App Store打不开问题的解决方法...
  8. Android 中 简单商品列表 的运用
  9. 小组取什么名字好_唐三和其他女神组CP取什么名字?当看到答案后,瞬间让人甜到掉牙...
  10. 我上了985,211,才发现自己一无所有 | 或者,也不能这么说