《Android开发艺术探索》读书笔记第一章--Activity的生命周期和启动模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a8341025123/article/details/79249567

本文是《Android开发艺术探索》读书笔记系列第一篇,作为学习的一个自我总结和二次复习

本章的思维导图

一、Activcity的生命周期

Activcity生命周期的切换过程总览

Activity启动流程图

针对流程图,附加一些具体说明:
1. 一个Activity新启动时,onCreate -> onStart -> onResume
2. 当打开新Activity或者返回桌面时,旧Activity 回调 onPause -> onStop
3. 返回原Activity时,onRestart -> onStart -> onResume
4. 按回退键退出时, onPause -> onStop -> onDestroy

各生命周期代表的意义

(1)onCreate:表示Activity正在被创建。可以做一些初始化工作。
(2)onStart:表示Activity正在被启动,此时Activity已经可见了,但还没有出现在前台,无法和用户交互。可以理解为已经显示出来,但用户还看不到。
(3)onResume:表示Activity已经课件,并出现在前台。与onStart对比,两个阶段Activity都为可见的,但是onStart时Activty还在后台。
(4)onPause:表示Activity正在停止。不能做耗时操作,理由是新的Activity必须等旧Activity执行完onPause后才能只能新Activity的onResume。
(5)onStop:表示Activity即将停止。可以做一些回收工作,但是不能太耗时。
(6)onDestroy:表示Activity即将销毁。在这个方法里做资源的回收和释放工作。
(7)onRestart:表示Activity正在重新启动,一般是Activity从不可见重新变为可见状态时调用。

特殊场景的生命周期

两个Activity的生命周期分析

  1. A Activity启动 B Activity:A的onPause -> B的onCreate -> B的onStart -> B的onResume -> A的onStop
  2. B 按back键返回 A :B的onPause -> A的onRestart -> A的onStart -> A的onResume -> B的onStop -> B的onDestroy

返回桌面、从桌面返回和息屏和开屏

这几种情况和普通的某个Activity返回后台、重现前台的生命周期一样,都是onPasuse -> onStop,重新返回Activity的话是onRestart -> onStart -> onResume

弹出diaolog或者透明主题的Activity

  1. 如果是本Activity的dialog弹出,不会调用任何方法
  2. 如果是其他Activity的diaolog弹出,会调用onPause
  3. 如果新打开的Activity设置了透明主题,原Activity只会调用onPause不会调用onStop

异常情况下的生命周期

情况1:资源相关的系统配置发生改变(如横竖屏切换)

比如横竖屏切换,在默认情况下,Activity会被销魂并且重新创建,生命周期如下:

Activity切换横竖屏 -> onPause -> (调用onSaveInstance()方法保存状态) -> onStop -> onDestroy -> onCreate -> onStart -> (onRestoreInstanceState()方法) -> onResume

注意:onSaveInstance()方法的调用和onPause的顺序没有绝对先后关系,可能在它之前也可能之后,但是一定是在onStop之前。onRestoreInstanceState()方法是在onStart之后执行。
我们可以给Activity设置android:configChanges = “”来让Activity在某项系统配置更改时不重新创建Activity,比如”orientation”表示屏幕旋转时不重新创建Activity

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

先说明一下各个Activity的优先级从大到小:
前台Activity(正在和用户交互的) > 可见但非前台的Activity(比如在Activity中弹出了一个对话框) > 后台Activity(不可见的,执行了onStop的)
其生命周期情况和情况一完全一致

二、Activity的启动模式

Activity的四种LauchMode

  1. standart模式:标准模式。每启动一个Activity都会重新创建新的实例,不管这个实例是否已经存在,被创建的实例也走完整的生命周期方法。在标准模式中,谁启动了这个Acitivity,那么该Activity就运行在启动它的那个Activity的任务栈中。(所以用ApplicationContext去启动标准模式的Activity时会报错,因为ApplicationContext是非Activity的Context,没有任务栈)
  2. singleTop:栈顶复用模式。如果在启动时,新的Activity已经在栈顶,那么不会创建新的Activity实例,会调用原有Activity的onNewIntent(),同时这个Activity的onCreate和onStart不会调用。如果在启动时,新的Activity在栈中但不在栈顶,,那么新的Activity实例仍然会创建。
  3. singleTask:栈内复用模式。当要启动新Activity时,会检查要求的栈内是否已经有此Activity,如果(1)有;则调用此Activity的onNewIntent(),并且在这个Activity之上的所有Activity出栈 (2)没有;则新创建一个Activity,入栈(3)不存在所要求的栈;则新创建一个栈,并且创建Activity入内
  4. singleInstance:单实例模式。除了拥有singleTask的所有特性外,还加强了一点,就是具有此模式的Activity只能单独的位于一个栈中。也就是在新创建的同时会为它新创建一个栈,后续直接栈内复用,除非这个栈被销毁。

TaskAffinity和singleTask的应用

TaskAffinity可以指定将启动的Activity的任务栈(不能为包名,因为默认栈是包名),一般和singleTask和allowTaskReparenting配对使用。
当应用A启动了应用应用B的某个Activity后,如果TaskAffinity指定的是A的栈并且allowTaskReparenting设置为True,那么当应用B在后续被启动后,在A栈中的B的Activity会被直接转移到应用B的栈中,打开应用B是显示的将不是B的MainActivity。如下图所示。

Activity的常用FLAG

  1. FALG_ACTIVITY_NEW_TASK:等同于singleTask
  2. FALG_ACTIVITY_SINGLE_TOP :等同于singleTop
  3. FALG_ACTIVITY_CLEAR_TOP:比较特殊。这个标记一般回合singleTask启动模式一起出现,在这种情况下,被启动的Activity实例如果存在,则调用onNewIntent()。如果被启动的Activity是standard模式,那么连同它和它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈中
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENT:具有这个标记的Activity不会出现在历史Activity的列表中。

IntentFilter的匹配规则

用于隐式启动,IntentFilter的过滤信息有action,category,data,只有一个Intent同时匹配这三项,才算完全匹配。一个Activity可以有多个Intent-Filter,但只要有一个匹配成功就算成功。

action的匹配规则

acion的匹配要求Intent中的action存在切必须和过滤规则中的其中一个action相同,区分大小写。

category的匹配规则

category可以要求Intent中没用category,但是如果一旦有category,不管有几个,每个都要和IntentFilter中的任何一个category相同。(为了能隐式启动activity,必须在intent-filter中设置category为deafult)

data的匹配规则

和action类似,也要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data,这里的完全匹配是指过滤规则中出现的data部分也出现在了intent中的data中。

猜你喜欢

转载自blog.csdn.net/a8341025123/article/details/79249567