文章目录

  • 第一章 Activity的生命周期和启动模式
    • 生命周期
    • 启动模式和flag
    • IntentFilter的匹配机制
    • 相关小记

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

生命周期

分为典型情况下的生命周期和异常情况下的生命周期

  • 典型情况
  1. 当打开新的Activity或者切换到桌面, 会调用onPause -> onStop. 如果新的Activity是透明主题, 那么当前Activity不会回调onStop
  2. 当启动新的Activity时, 旧的Activity先执行onPause, 然后新的Activity才启动. 所以在onPause中不能执行耗时操作, 尽量在onStop中做操作
  3. 创建与销毁 onCreate onDestroy
    位于可见状态 onStart onStop
    位于前台状态 onResume onPause
  • 异常情况
  1. 资源配置的更改
    @Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putBoolean(SAVED_SUBTITLE_VISIBLE, mSubtitleVisible);}

上面的数据会传入给onCreateonRestoreInstanceState, 区别在于在onCreate正常启动时Bundle 为空,判断不为空才能取出. 而onRestoreInstance一旦被调用, 就一定是有值的

  1. 内存不足被系统杀死
    1.过程与1中的恢复重建相同
    2.优先度的问题
    从高到低依次为 前台 可见 后台(执行了onStop)

启动模式和flag

  • 任务栈
    Activity需要任务栈, 而标志着任务栈名称的参数为TaskAffinity(任务相关性). 默认情况下Activity的任务栈名称为包名.
    指定时不能与包名相同, 否则没有意义. 通常与singleTask模式 或allowTaskReparent属性配对使用
  1. singleTask启动: 会创建新的任务栈
  2. allowTaskReparent属性 设为true时, 应用会将有此属性的Activity, 从别的启动这个Activity的应用的应用栈中移回来
  • 指定启动模式
  1. 在Activity的AndroidManifest文件中指定启动模式
  2. Intent中设置flag(标志位)来设置启动方式
  3. 2的优先级大于1.
  • 启动模式的种类
  1. standard(标准模式): 谁启动这个activity, 就运行在启动她的那个activity的栈中. 且每次启动都会创建一个新的activity实例
    如: 启动d 时该栈有 abcd -> abcdd
  2. singleTop(栈顶复用模式): 新的activity已经位于栈顶, 则不会创建新的activity, 即不会调用onCreate和onStart. 同时会被回调onNewIntent方法. 如: 启动d 有 abcd -> abcd
    若不在栈顶, 则会重新创建该activity. 如:启动b 有abcd -> abcdb
  3. singleTask(栈内复用模式): 创建时activity时, 系统寻找是否有该activity的栈, 如果没有就创建该栈. 栈若存在. 则寻找(或创建)activity实例并放到栈顶(寻找的会使上层activity出栈并回调onNewIntent方法).
  4. singleInstance(单实例模式): 增强版的栈内复用, 具有此模式的activity只能单独位于一个任务栈中, 且具有栈内复用的特性.
  • flag的种类
    在使用flag时需要注意的是有些标志位是系统调用的, 不能手动调用以防出现问题
  1. FLAG_ACTIVITY_NEW_TASK
    等同于singleTask
  2. FLAG_ACTIVITY_SINGLE_TOP
    等用于singleTop
  3. FLAG_ACTIVITY_CLEAR_TOP
    一般与FLAG_ACTIVITY_NEW_TASK配合使用, 如果实例存在, 就会回调onNewIntent来得到相关的参数 abc -> a
    如以 standard 模式启动, 那么连同他及以上的activity都要出栈, 且系统会创建新的activity实例放入栈中. abc -> 新a
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    等同于指定activity的属性:android:excludeFromRecents=“true”, 具有此标记的activity不会出现在历史activity的列表里

IntentFilter的匹配机制

  • 在AndroidManifest中action下的IntentFilter中设置过滤规则
    过滤规则有action(系统预设或自定义字符), category(系统预设或自定义字符), data(默认URI为contentfile)
  • intent匹配过滤规则
  1. action: 必须有且至少匹配过滤规则中的一个, 否则无法启动相应的activity’
  2. category: 可以没有(因为发送Intent时系统会自动添加android.intent.category.DEFAULT, 因此必须在需要隐式调用的activity的IntentFilter中加上这个)
  3. data: 必须有且至少匹配过滤规则中的一个, 否则无法启动相应的activity
    不能分别设置setData和setType, 两者会相互清除对方的值. 若要完整指定, 则为setDataAndType
    由两部份组成, mimeType(媒体类型)和 URI.
    URI结构: <scheme>://<host>:<post> <port>/ [<path>| <pathPrefix>| <pathPattern>]
    1.scheme:模式, 比如:http, content, file等,不指定, 则整个URI无效.
    2.host:主机名不指定则无效
    3.port: 端口号
    4.path完整的路径信息. pathPattern:完整的路径信息, 可以含通配符, *(代表任意字符). pathPrefix: 路径的前缀信息
  • 匹配机制同样适用于Service 和BroadcastReceiver, 但系统对于Service的建议是尽量使用显示调用.

相关小记

  • 任务栈的特殊情况

  • 查看任务栈
  1. 执行 adb shell dumpsys activity 命令
  2. 查看日志中的 Running activities(most resent first)项
    位于同一个栈内的activity会列在一起.
  • 可以判断是否有activity匹配隐式intent(如果不进行判断, 当找不到匹配Intent就会报错ActivityNotFoundException)
  1. PackageManager的resolveActivity或intent的resolveActivity, 找不到,则返回null
  2. PackageManager的queryIntentActivity, 返回所有成功匹配的Activity信息. 参数需要需要传入flag MATCH_DEFAULT_ONLY. , 该标志表明仅仅匹配那些在intentFilter中声明了DEFAULT规则的activity. 即, 如果没有使用该标志, 那么就会匹配没有声明DEFAULT的activity, 而没有声明该DEFAULT的activity不能接收隐式intent, 从而导致startActivity可能失败. (所以在需要时给其声明)
  • 以下两者相互依存, 共同标明是应用的入口activity, 且会出现在系统的应用列表中
      <action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER"/>

Android开发艺术探索 第一章 Activity的生命周期和启动模式相关推荐

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

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

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

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

  3. Android开发艺术探索--第二章IPC机制(2)之Binder

    最近在拜读任主席的Android开发艺术探索,现在看了一半,再回头看前面的,感觉跟没有看一样,所以还是把知识点总结一下吧,这一节咱们来讲一下IPC中的Binder 直观来说,Binder是Androi ...

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

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

  5. Android开发艺术探索——第九章:四大组件的工作过程(下)

    我們继续来看四大组件的工作过程 一.BroadcastReceiver的工作过程 广播的工作过程,我们主要看两个方面,一个是注册过程,另一个就是接收的过程,我们想使用广播是非常简单的,只需要继承Bro ...

  6. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

  7. 《Android开发艺术探索》完结篇

    笔记链接: <Android开发艺术探索>之Activity的生命周期和启动模式(一) <Android开发艺术探索>之IPC机制上(二) <Android开发艺术探索& ...

  8. 《Android开发艺术探索》

    序 昨晚准备参考一下 <Android 开发艺术探索>这本书写一个博客 ,但是在家里找了好长时间也找不见 .所以就找了网上的文章 .这本书强烈推荐大家好好读几遍 . <Android ...

  9. 《Android开发艺术探索》笔记目录

    该笔记以<Android开发艺术探索>为基础,结合Android 9.0代码和官方文档,修正了原书中表述不明确和过时的部分,同时加入了大量的个人理解. 13章,14章,15章是总结性的章节 ...

  10. 《Android开发艺术探索》读书笔记

    一.前言 花了几天整理完<Android进阶之光>的读书笔记,效果不是很满意,把以前零散整合成一片超长笔记,总感觉也不是那么好,决定接下来读书笔记还是拆开来,以后也好查找一点. 二.目录 ...

最新文章

  1. 一个NullPointerException,竟然有这么多花样!
  2. python 问题不符合dcp rule_约束不遵循CVXPY中的DCP规则
  3. wand java源码_ImageMagick使用for java(im4java)
  4. 项目: 实时钟表(C语言)
  5. 一个包的TcpServer流程
  6. UTC转换BJT时间 时间转换 c语言程序设计 mooc 翁恺
  7. 使用fastapi时在py文件中无法正常引用
  8. 【GEE】配置本地python环境
  9. w3wp.exe进程资源占用过大问题
  10. C++ TCP Socket的使用(阻塞)
  11. 关于闲鱼测试数据构造,我有几条心得
  12. vue前端怎么下载后端返回的二进制流excel表格文件
  13. kafka的安装和使用(详细版)
  14. 贝叶斯统计推断_统计推断对决:频繁主义者与贝叶斯主义者
  15. python实现图像白平衡
  16. 【C语言】C语言中赋值语句规则
  17. Ubuntu aria2c 下载
  18. 年薪50万+的90后程序员都经历了什么?
  19. 二个数据库之间怎么同步
  20. Arduino与Proteus仿真实例-HG7881(L9110)驱动直流电机仿真

热门文章

  1. python中sklearn.datasets.make_blobs()函数用法
  2. spring boot UnsatisfiedDependencyException:
  3. 微信应用架构!!-----微信应用能力篇
  4. 什么是Hadoop以及Hadoop集群
  5. 软件腐化的七个特征之复杂性、重复性、晦涩性(设计模式原则的反面) (《敏捷软件开发》读书总结第三篇)
  6. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(上)
  7. 科学松鼠会-Kindle精选
  8. Linux驱动中私有数据filp-private_data的作用
  9. 移动硬盘 无法访问 解决方法
  10. 适当的发泄 有助于自我调整