Activity 的生命周期

典型情况下的生命周期

典型情况下的生命周期,指的是在有用户参与的情况下,Activity 所经历的生命周期的改变。

// Activity第一次启动
onCreate -> onStart -> onResume// 被新的Activity覆盖或者Home键返回桌面
// 新的Activity主题透明或者对话框样式,只会调用onPause
onPause -> onStop// 从新的Activity返回原来Activity
onRestart -> onStart -> onResume// 按返回键退出Activity
onPause -> onStop -> onDestory// 从一个Activity打开一个新的Activity的完整流程
A-Activity:onPause
B-Activity:onCreate
B-Activity:onStart
B-Activity:onResume
A-Activity:onStop// 从新的Activity返回的完整流程
B-Activity:onPause
A-Activity:onRestart
A-Activity:onStart
A-Activity:onResume
B-Activity:onStop
B-Activity:onDestroy

异常情况下的生命周期

异常情况下的生命周期,指的是 Activity 被系统回收或者由于当前设备的 Configuration 发生改变导致 Activity 被销毁重建而经历的生命周期的改变。

  • 没有设置 Activity 的 android:configChanges,切屏会默认销毁当前 Activity,然后重新创建 Activity,会重走各个生命周期调用
  • 设置了 Activity 的 android:configChanges="orientation|screenSize",切屏不会销毁和重新创建 Activity,只会执行 onConfigurationChanged 方法

Activity 的启动模式

Standart

标准模式,也是系统的默认模式,每启动一个 Activity 都会创建一个新的实例压入栈顶,谁启动了这个 Activity,这个 Activity 就会运行在启动它的 Activity 所在的栈中,这个模式下启动的 Activity 不会调用 onNewIntent 方法。

singleTop

栈顶复用模式,在这种模式下,如果新的 Activity 已经位于任务栈的栈顶,就不会创建新的实例,同时 onNewIntent 方法会被调用。

如果新 Activity 的实例存在于任务栈内,但是不在栈顶,那么就会创建新的 Activity 实例并压入栈顶。

应用场景:搜索界面、通知栏进入的界面

singleTask

栈内复用模式,在这种模式下,在这种模式下,只要一个栈中存在此 Activity 的实例,那么多次启动此 Activity 都不会创建新的实例,只会调用其 onNewIntent 方法,同时,由于 singleTask 模式默认具有 clearTop效果,会导致栈内所有在此 Activity 之上的 Activity 全部出栈。

应用场景:应用主页

singleInstance

单实例模式,这个模式具有 singleTask 所有的特性,还加强了一点,这个模式的 Activity 只能单独的位于一个任务栈中。

TaskAffinity 属性的作用

每个 Activity 都有 taskAffinity 属性,这个属性指出了它希望进入的 Task。如果一个 Activity 没有显式的指明该Activity 的 taskAffinity,那么它的这个属性就等于 Application 指明的 taskAffinity,如果 Application 也没有指明,那么该 taskAffinity 的值就等于包名。

TaskAffinity 属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用。

  • 与 singleTask 启动模式时搭配时,待启动的 Activity 会运行在名字和 TaskAffinity 相同的任务栈中
  • 与 allowTaskReparenting 属性搭配时,当一个应用 A 启动应用 B 的某个 Activity 后,如果这个 Activity 的 allowTaskReparenting 属性为 true,那么当应用 B 被启动后,此 Activity 会直接从应用 A 的任务栈转移到应用 B的任务栈中

Activity 的 Flags

  • FLAG_ACTIVITY_NEW_TASK:为 Activity 指定 singleTask 启动模式
  • FLAG_ACTIVITY_SINGLE_TOP:为 Activity 指定 singleTop 启动模式
  • FLAG_ACTIVITY_CLEAR_TOP:启动具有此标志位的 Activity,在同一个任务栈中所有位于它之上的 Activity 都要出栈,这个标志位一般和 FLAG_ACTIVITY_NEW_TASK 搭配使用
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标志位的 Activity 不会出现在历史 Activity 列表中,等同于在清单文件中指定 Activity 的属性 android:excludeFromRecents="true"

IntentFilter 的匹配规则

  • IntentFilter 的过滤信息有 action、category、data 三种
  • 只有一个 Intent 同时匹配 action、category、data 三种类别信息才算完全匹配,只有完全匹配才能启动目标 Activity
  • 一个 Activity 可以有多个 intent-filter,一个 Intetn 只要能匹配任何一组 intent-filter 就能启动目标 Activity
  • action 的匹配规则要求 Intent 中的 action 存在且必须和过滤规则中的其中一个 action 相同,这里的相同指的是字符串值完全一样,另外,action 区分大小写
  • category 的匹配规则要求 Intent 中如果含有 category,那么所有的 category 必须和过滤规则中的其中一个 category 相同
  • Intent 可以不设置 category,系统在调用 startActivity 或 startActivityForResult 的时候会默认为 Intent 加上 android.intent.categoty.DEFAULT 这个 category
  • 为了我们的 Activity 能够接收隐式调用,就必须在 intent-filter 中指定 android.intent.categoty.DEFAULT 这个 category
  • data 的匹配规则要求如果过滤规则中定义了 data,那么 Intent 中必须含有可匹配的 data,这里的匹配指的是过滤规则中出现的 data 部分也出现在了 Intent 的 data 中

启动 Activity 的方式与优先级

  1. 显式调用,需要明确地指定被启动 Activity 的包名、类名
  2. 隐式调用,需要 Intent 能匹配目标 Activity 的 IntentFilter 中设置的过滤规则
  3. 显式调用的优先级高于隐式调用

在 Service 或者 Receiver 中怎么启动 Activity

因为 standard 模式下的 Activity 会默认运行在启动它的 Activity 的任务栈中,但是非 Activity 的 Context 并没有所谓的任务栈,所以直接启动就会报错,需要为待启动的 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标志位,这样启动它的时候就会为它创建一个新的任务栈,相当于以 singleTask 模式启动了这个 Activity。

setResult 和 finish 的调用关系

问题:如果不能在 setResult() 之后立刻调用 finish() 方法,那么 setResult() 该在哪里调用?

Activity-A 通过 startActvityForResult() 打开了 Activity-B,B 退回 A 过程

B-onPause
A-onActivityResult
A-onRestart
A-onStart
A-onResume
B-onStop
B-onDestory

由源码可以看出,Activity 返回 result 是在 finish 的时候,也就是调用 setResult() 方法必须在 finish 之前,又因为 A 的 onActivityResult() 需要在 B 的 onPause() 之后且 A 的 onRestart() 之前调用,而 onPause() 的调用不一定是在 finish() 之前,所以 B 中的 setResult() 方法要放在 B 的 onPause 之前调用。

解决方法:可以重写 onBackPressed() 方法,在执行默认的返回方法之前 setResult()

@Override
public void onBackPressed(){setResult();super.onBackPressed();
}

执行过程为

B-onBackPressed
B-finish
B-onPause
A-onActivityResult
A-onRestart
A-onStart
A-onResume
B-onStop
B-onDestroy

activity finish后没有destroy_Activity 基础知识点相关推荐

  1. Android基础知识点学习总结

    Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...

  2. Smali相关的基础知识点

    通过本篇博客的学习,相信你可以无压力的读懂Smali语言文件,并可以将Smali还原成java!!! 其实Smali语言并不是很难,如果你有一些汇编指令的基础,学习Smali就更加简单了,有兴趣的可以 ...

  3. Python培训教程之Python基础知识点梳理

    Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...

  4. 自然语言处理算法工程师历史最全资料汇总-基础知识点、面试经验

    2019年秋招已过,零星的招聘任然在继续.本资源适用于NLP算法工程师面试,也适用于算法相关的其他岗位.整理了算法面试需要数学基础知识.编程语言.深度学习.机器学习.计算机理论.统计学习.自然语言处理 ...

  5. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  6. python基础知识整理-整理了27个新手必学的Python基础知识点

    原标题:整理了27个新手必学的Python基础知识点 1.执行脚本的两种方式 Python a.py 直接调用Python解释器执行文件 chomd +x a.py ./a.py #修改a.py文件的 ...

  7. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  8. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点

    转载自:http://blog.csdn.net/niuwei22007/article/details/47399913 <CNN基础知识点>From:Convolutional Neu ...

  9. 全国计算机二级考试vf知识点总结,VF全国计算机等级考试二级公共基础知识点总结.doc...

    VF全国计算机等级考试二级公共基础知识点总结 第一章数据结构与算法 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 算法的三种基本控制结构:顺序,选择,循环. 算法的复杂度主要包括:时间复杂 ...

最新文章

  1. Mongodb索引和执行计划 hint 慢查询
  2. 使用Dnsmasq加速苹果App Store、iCloud、iTunes、Mac更新等访问速度
  3. 科大星云诗社动态20210323
  4. yolov4论文_YOLOv4论文详细解读
  5. 当你老了,一生最后悔什么?大数据告诉你!
  6. spring_01概念及案例
  7. 【推荐实践】强化学习算法在京东广告序列推荐场景的应用
  8. xamarin.android 图片高斯模糊效果
  9. VFS之基本数据结构
  10. 表格/列表法之分部积分
  11. 微软面试58道逻辑面试题
  12. 怎么读取cf卡id_CF卡传输程序的步骤解析
  13. lookup无序查找_Excel LOOKUP不排序怎么快速找到数据_lookup函数讲解
  14. java时区ZoneId集
  15. 使用opencv-python制作屏幕录制工具
  16. 计算机教室英语手抄报,我的教室英语手抄报
  17. mysql三个分组排序方法row_number()、rank()、dense_rank()
  18. ipynb转py命令
  19. java简单实现仿QQ登陆界面
  20. win10上打不开epub小说怎么办?快试试以下几种办法

热门文章

  1. 第六次作业:结对项目之需求分析与原型设计
  2. JS高级——面向对象方式解决歌曲管理问题
  3. VS 2005 命令行cl编译配置 Notepad++设置
  4. 如何在 Linux 终端中一次运行多个 Linux 命令(初学者教程)
  5. FFmpeg之yuv旋转(十九)
  6. Wine DLL库安装工具winetricks
  7. Mac上IDA报错/:Permission denied Please specify another file path for the database
  8. 802.11 monitor模式
  9. webgis之相关工具
  10. datagridview滚动条自动滚动_一个自适应滚动条的实现