1.1 Activity的生命周期全面分析

Activity的生命周期分为两个部分,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。典型情况下的生命周期,是指在所有用户参与的情况下,Activity所经过的生命周期的改变;异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。

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

一般情况下Activity生命周期执行的顺序是:onCreate()->onRestart()->onStart()->onResume()->onPause()->onStop()->onDestory().
这里面需要注意的是onStart()、onResume()、onPause()、onStop()这四个函数功能。
onStart():表示Activity正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法和用户交互。这个时候其实可以理解为Activity已经显示出来了,但是我们还看不到。
onResume():表示Activity已经可见了,并且出现在前台并且开始活动(获取焦点)。要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被调用。在特殊情况下,如果这个时候快速地回到当前Activity,那么onResume会被调用。
在这个阶段需要搞懂两个问题:
1. onStart和onResume、onPause和onStop从描述上来看差不多,对于我们来说有什么实质的不同呢?
最大的不同在于:是否获得用户的焦点,也就是能不能和用户交互。
2. 假设当前Activity为A,如果这时用户打开一个新的Activity B,那么B的onResume和A的onPause哪一个先执行
A的onPause执行完后才会执行B的onResume,只有在A的onPause执行完后,才会创建新的B。

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

异常一般会有两种情况:
(1). 资源相关的系统配置发生改变导致Activity被杀死并重新创建。

  • 这里的异常一般是指例如 竖屏到横屏的变化等,在这种异常情况下,系统会调用onSaveInstanceState来保存当前的Activity状态。这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系。需要强调的一点是,这个方法只会出现在Activity被异常终止的情况下,正常情况下系统是不会回调这个方法。
  • 当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的bundle对象作为参数同事传递给onRestoreInstanceStateonCreate方法。
  • 在异常情况下,系统会默认为我们保存当前Activity的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用于输入的数据、ListView滚动的位置等,这些View相关的状态系统都能够默认为我们恢复。每个View都有onSaveInstanceStateonRestoreInstanceState这两个方法。

(2). 资源内存不足导致低优先级的Activity被杀死。

  • 优先级从高到低依次为:前台Activity、可见但并非前台的Activity和后台的Activity

(3). android:configChanges="..."这个属性可以使系统在特定的场景下部重建,常用的有下面几个选项:

  • local:设备的本地位置发生了变化,一般指切换了系统语言;
  • keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;
  • orientation:屏幕方向发生了变化,比如旋转了手机屏幕。
    配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用ActivityonConfigurationChanged方法。

1.2 Activity启动模式

1.2.1 启动模式

  1. 当栈中没有任何Activity的时候,系统就会回收这个任务栈。
  2. 从非Activity类型的Context(例如,Application、Service等)中以standard模式启动其他的Activity是不行的,这是因为standard模式的Activity默认会进入启动它的Activity所属的任务战中,但是由于非Activity类型的Context并没有所谓的任务栈。但是可以为待启动Activity指定FLAG_ACTIVITY_NEW_TASK标记位。
  3. 任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。
  4. 参数TaskAffinity,意为任务相关性。这个参数标识了一个Activity所需要的任务栈的的名字,默认情况下,所有Activity所需要的任务栈的名字为应用的包名。TaskAffinity属性主要和SingleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。当TaskAffinitysingleTask启动模式配对使用的时候,它具有该模式的Activity目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
    TaskAffinityallowTaskReparenting结合的时候,当一个应用A启动了应用B的某个Activity C后,如果Activity C的allowTaskReparenting属性设置为true的话,点击home到主界面,然后点击应用B,那么当应用B被启动后,系统会发现Activity C所需的任务栈存在了,就将Activity C从A的任务栈中转移到B的任务栈中。
  5. Activity有两种启动模式,一种是通过AndroidMenifest,一种的通过在intent.addFlags()。二者区别:首先,优先级上第二种方式的优先级要高于第一种,当两种同事存在时,以第二种方式为准;其次,上述两种方式在设定范围上有所不同,比如,第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。
  6. singleTask模式的具体分析:当一个具有singleTask启动模式的Activity请求启动之后,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建Activity的实例把它放到栈中;如果存在Activity所需要的任务栈,这时候要看栈中是否有Activity实例存在,如果有,那么系统就会把该Activity实例调到栈顶,并调用它的onNewIntent方法(它之上的Activity会被迫出栈,所以singleTask模式具有FLAG_ACTIVITY_CLEAR_TOP效果);如果Activity实例不存在,那么就创建Acitivty实例并把它压入栈中。

1.2.2 Activity的Flags

Activity的Flags主要包含有:FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOPFLAG_ACITIVTY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用,它等同于属性设置android:excludeFromRecents="true"

IntentFilter的匹配规则

(1). IntentFilter中的过滤信息由action、category、data,为了匹配过滤列表,需要同时匹配过滤列表中的actiion、category、data信息,否则匹配失败。一个过滤列表中的action、category、data可以有多个,所有的action、category、data分别构成不同类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Inten同时匹配action类别、category类别和data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。此外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。

<intent-filter><action android:name="com.ryg.charpter_1.c" /><action android:name="com.ryg.charpter_1.d" /><category android:name="com.ryg.category.c" /><category android:name="com.ryg.category.d" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" />
</intent-filter>

(2). action匹配规则:只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action匹配区分大小写。
(3). category匹配规则:Intent中如果有category那么所有的category都必须和过滤规则中的其中一个category相同,如果没有category的话那么就是默认的category,即android.intent.category.DEFAULT,所以为了Activity能够接受隐式低啊用,配置多个category的时候必须加上默认的category。
(4). data匹配规则:data的结构很复杂,语法大致如下

<data android:scheme="string"android:host="string"android:port="string"android:path="string"android:pathPattern="string"android:pathPrefix="string"android:mimeType="string" />

第一章 Activity的生命周期和启动模式相关推荐

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

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

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

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

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

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

  4. Activity生命周期和启动模式

    Activity生命周期和启动模式 1. 典型情况下的生命周期分析 完整生存期:onCreate()-onDestory(),分别标识着Activity的创建和销毁,并且只可能有一次调用. 可见生存期 ...

  5. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html 导言 用户通过导航退出或者返回应用的时 ...

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

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

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

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

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

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

  9. Activity具体解释(生命周期、启动方式、状态保存,全然退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的A ...

  10. Android开发---Activity的生命周期

    在Android开发中,第一步学习的应该是最基础的东西,即Activity的声明周期,相信Activity对于从事Android开发的朋友都很熟悉,这里作者不多做解释.Android的生命周期可以用如 ...

最新文章

  1. Centos6.5安装python2.7与pip
  2. .NET学习之Foreach……
  3. SciencePlots科研绘图
  4. 模态对话框和非模态对话框的消息循环分析
  5. 将Spring集成到旧版应用程序中
  6. 计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧
  7. 《C程序设计语言》-第2章-习题
  8. Spring Data JPA 从入门到精通~自定义实现Repository
  9. JAVA几何图注水,如何使用java绘制几何形状到图片?
  10. 蒋涛担任上方新一届董事长,打造 TokenSky 全球区块链服务生态集团
  11. 实习生有年终奖吗_“辞职,一定要赶在发年终奖前!”为什么我建议你一定要年前跳槽...
  12. 苹果邮箱怎么登录qq邮箱_电子邮箱 电子邮箱格式怎么写
  13. 计算机桌面出现临时文件,如何删除电脑中的临时文件 电脑屏幕一键放大方法分享...
  14. SCI、EI、ISTP、ISR简介
  15. 重磅 | 揭秘IARPA项目:解码大脑算法或将彻底改变机器学习
  16. Python 百天读书笔记 | Python语言进阶 16-20day
  17. 路由追踪traceroute分析
  18. A - Adventure Time-还是太菜了.
  19. 每周市场观察:多头转空头? | TokenInsight
  20. py2exe安装及使用方法

热门文章

  1. 基于k-means的大数据客户细分 - python 数据挖掘
  2. MIT开创减少双量子比特门误差的新方法,提高鲁棒性迈向纠错量子计算机
  3. 如何在 Mac 上的邮件中添加签名来个性化电子邮件?
  4. ps在当前的图片添加一张图片进来
  5. 挂载NFS的两种方法
  6. Grid 不能动态添加数据这是为什么呢!
  7. java access group by 用法_详解SQL中Group By的用法
  8. Golang验证身份证号码是否有效
  9. 爬虫笔记-Bugku秋名山老司机(入门)
  10. java给pdf文件加水印