Activity的生命周期和启动模式

一、什么是Activity?

Activity是Android组件中最基本也是最为常见用的四大组件之一 。

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

二、 Activity的生命周期

2.1 典型情况下的生命周期:

onCreate:表示Activity正被创建。可以做一些初始化的工作,比如调用setContentView加载界面布局、初始化数据。

onRestart:表示Activity正在重新启动。当前Activity从不可见重新变为可见状态,就会调用onRestart。场景:用户按Home键切换到桌面或用户打开一个新的界面,然后重新回到这个页面。

onStart:表示Activity正在被启动,即将开始。可见,但未展示在前台,无法与用户交互

onResume:表示Activity获得焦点。可见,并且出现在前台,可交互

onPause:正在停止。此时Activity在前台并可见,可做存储数据、停止动画等工作,切勿执行太耗时的操作。

onStop:即将停止。不可见,可做稍微重量级的回收工作,同样不能太耗时。

onDestroy:即将被销毁。做回收工作和最终的资源释放。

onCreate、onDestroy 一对  只调用一次。

onStart、onStop一对  是否可见。

onResume、onPause一对  是否在前台。

2.1.1 Activity生命周期的切换过程:

Activity第一次启动:onCreate->onStart->onResume

当用户打开新的Activity或者切换到桌面的时候:onPause->onStop

当用户返回原Activity:onRestart->onStart->onResume

按back键回退:onPause->onStop->onDestroy

在当前Activity上打开新的Activity:旧onPause->新OnCreate->onStart->onResume->旧onStop

 Activity生命周期的切换过程

2.2 异常情况下的生命周期

情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建(比如屏幕旋转导致的系统配置发生改变)

Activity被意外终止时,才会调用onSaveInstanceState和onRestoreInstanceState去保存数据和恢复数据,其他情况不会触发这个过程。

系统配置发生改变但不希望重新创建Activity,可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转时重新创建,可以在manifest中给当前的Activity设置android:configChanges="orientation",不会调用onSaveInstanceState和onRestoreInstanceState去保存数据和恢复数据,取而代之的是调用onConfigurationChanged。

configChanges  常用参数:

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

Activity优先级:

由高到低:前台Activity > 可见但非前台Activity(比如:Activity中弹出一个对话框,此时的Activity可见但无法与用户交互)> 后台Activity(执行了onStop的Activity)

当内存不足时,系统会按照优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,那么将很快被系统杀死。

三、Activity的启动模式

3.1 四种启动模式(LaunchMode)

standard:标准模式,系统的默认模式。

每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。被创建的实例符合典型的Activity生命周期。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

标准模式下的Activity启动示意图

singleTop:栈顶复用模式

在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新Activity的实例已经存在但不是位于栈顶,那么新的Activity仍然会重建。

举三个栗子来理解Activity的栈顶复用模式:

①一个栈内有ABCD四个Activity,A位于栈底,D位于栈顶。此时启动D ,启动模式为SingleTop,因为D在栈顶,D不会重新创建,那么栈内情况仍为ABCD。

②同样,一个栈内有ABCD四个Activity,A位于栈底,D位于栈顶。启动D ,模式为standard(标准模式),因为每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在,所以D会再次创建,那么栈内的情况为ABCDD。

③同样,一个栈内有ABCD四个Activity,A位于栈底,D位于栈顶。启动C, 模式为SingleTop,因为C不在栈顶,已经存在,所以C会再次创建,那么栈内的情况为ABCDC。

栈顶复用模式Activity启动示意图

singleTask:栈内复用模式

singleTask是一种单实例模式。此模式下,只要Activity在一个栈中存在,那么多次启动这个Activity都不会重新创建。

比如:Activity A以singleTask模式请求启动,系统会先去寻找是否存在A想要的任务栈。如果不存在,就重新创建一个任务栈,然后创建A的实例,并放入到此栈中。如果存在A所需的任务栈,就看栈内是否含有A的实例,若实例存在,系统就会把A调至栈顶并调用它的onNewIntent方法;如果实例不存在,就创建A的实例并把A压入栈中。

举个三个栗子来理解Activity的栈内复用模式:

①已有任务栈S1,栈内有ABC三个Activity,这个时候Activity D以singleTask模式请求启动,其所需任务栈为S2,因为S2和D的实例都不存在,所以系统会先创建任务栈S2,然后创建D的实例并入栈S2。

栗子1

②已有任务栈S1,栈内有ABC三个Activity,这个时候Activity D以singleTask模式请求启动,其所需任务栈为S1,因为S1已经存在,所以系统就创建D的实例并入栈S1。

栗子2

③已有任务栈S1,栈内有ADBC四个Activity,此时栈内Activity D以singleTask模式请求启动,因为D实例已经存在,所以不会重建。为了把D切到栈顶,D上面的Activity会依次出栈。最终栈内只有AD。

栗子3

singleInstance:单实例模式

singleInstance模式具有singleTask模式的所有特性,此外singleInstance模式的Activity只能单独地位于一个任务栈中。

比如:Activity是singleInstance模式,A启动后,系统为它创建一个新的任务栈,然后A独自在这个栈中,由于栈内复用特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。


3.1.1 如何给指定的Activity指定启动模式?

①在AndroidMenifest指定Activity的启动模式

②通过在Intent中设置标志位

二者区别:

两种启动模式的区别

3.1.2  Activity的Flags

Activity常用的Flags

这里特别提下FLAG_ACTIVITY_CLEAR_TOP的一个使用场景,现有四个页面ABCD,页面A跳转至B,B到C,C到D,在D页面操作交易成功后返回至A页面,注意,D页面若是按返回键则原路返回至C、B、A,所以在B、C、D页面跳转就finish的方案不符合需求。这里FLAG_ACTIVITY_CLEAR_TOP就派上用场了,具体用法见截图:

3.1.3 IntentFilter 的匹配规则

启动Activity分为显示和隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。

action的匹配规则:要求Intent中的action存在且必须和过滤规则中的其中一个action相同。action是字符串,区分大小写。

category的匹配规则:Intent中的category可以不存在,如果存在,则每个Intent中的category都要与规律规则的一致。

data的匹配规则:如果过滤规则中定义了data,那么Intent中也要定义可匹配的data。

data的结构:mimeType和URI。

mineType:指媒体类型,可以表示图片、文本、视频等媒体格式。比如image/jpeg、audio/mpeg4-generic、video/*等。

URI的结构:



感谢您耐心地读到最后。在此特别说明一下,这是我拜读大佬任玉刚老师的《Android 开发艺术探索》一书整理出来的读书笔记,文字、截图都是我辛苦整理出来的,相信大方的你会点赞的,对吗?

你可能感兴趣的:(Activity的生命周期和启动模式)