Android四大组件之Activity

1、Activity生命周期

一般情况下Activity会经历如下生命周期:
为了方便先上一下官方的Activity生命周期图解

(1)onCreate(): 表示activity正在被创建,是activity的第一个生命周期,在这期间进行页面的初始化,setContenView()加载页面布局资源、初始化一些变量等工作。

(2)onStart(): 表示activity正在启动,这个时候已经可见,但是还未出现在前台,不能和用户进行交互。这个时候activity已经出来了但我们看不到。

(3)onResume(): 表示activity已经可见了,位于前台了,可以和用户进行交互。和onStart的相同点和区别:onStart和onResume时期Activity都已可见,但onStart不在前台,不能与用户进行交互,而onResume已在前台,可以和用户进行交互。

(4)onPause(): 表示activity正在暂停,正常情况下紧接着就执行onStop,这期间可以进行一些动画停止、数据存储工作。但不能耗时,否则会影响新activity的启动。因为启动新activity时,执行onPause()后就会执行新Activity的onCreate

(5)onStop(): 表示activity即将停止,这期间可以做一些重量级的回收工作。但不能太耗时

(6)onDestroy(): 表示activity即将被销毁,这是activity最后一个生命周期,这期间可以做一些回收工作和资源回收。

(7)onRestart(): 表示activity重新启动,即从不可见状态变为可见状态时就会被调用,一般情况下都是用户操作才会调用,例如用户操作Home键或者启动一个新页面,旧页面会执行onPause和onStop,然后再回到旧页面,这时就会调用onRestart,然后再调用onStart和onResume

2、Activity启动模式

  • 2.1、standard Activity默认的启动模式,每次启动Activity都会创建一个新的实例,放入任务栈中。这是一个典型的多实例,每一个任务栈可以有多个Activity,每个Activity可以属于多个任务栈。哪个Activity启动了当前Activity,当前Activity就放入改Activity所在的任务栈。比如
    Activity A启动了Activity B,那么Activity B就位于Activity A所在的任务栈中。此模式下onCreate()、onStart()、onResume()都会执行。
    image.png

  • 2.2、singleTop 栈顶复用模式,启动的Activity位于栈顶时则会通过调用onNewItent()方法复用原来的Activity,不再创建一个新的实例。否则会像standard模式那样。一句话概述就是:当且仅当启动的 Activity 和上一个 Activity 一致的时候才会通过调用 onNewIntent() 方法重用 Activity 。使用场景:资讯阅读类 APP 的内容界面。

    image.png
    image.png
  • 2.3 singleTask 栈内复用模式,当启动的Activity位于栈内时,就会通过调用onNewItent()方法复用当前的Activity,如果当前Activity上面还有其他Activity,同时会将其他Activity从栈内移出。如果栈内不存在当前Activity,则和standard模式一样。即: A ->B -> C -> D -> B,此时栈内变成了 A -> B。而 A -> B -> C,栈内还是 A -> B -> C。使用场景:浏览器的主页面,或者大部分 APP 的主页面。
image.png
image.png
  • 2.4 singleInstance 单实例模式,是一个加强版的singleTask,除了拥有singleTask的特性外,此种模式下Activity单独在一个任务栈中,依然是调用 onNewIntent() 方法。
    image.png
    image.png

到这里Activity启动模式就要说完了,其实还有一点与其相联系的知识,那就是Inent标签
在 Android 中,我们除了在清单文件 AndroidManifest.xml 中配置 launchMode,当然可以用 Intent 标签说事儿。启动 Activity ,我们需要传递一个 Intent,完全可以通过设置 Intent.setFlags(int flags) 来设置启动的 Activity 的启动模式。

需要注意的是:通过代码来设置 Activity 的启动模式的方式,优先级比清单文件设置更高。

FLAG_ACTIVITY_NEW_TASK
这个标识会使新启动的 Activity 独立创建一个 Task。

FLAG_ACTIVITY_CLEAR_TOP
这个标识会使新启动的 Activity 检查是否存在于 Task 中,如果存在则清除其之上的 Activity,使它获得焦点,并不重新实例化一个 Activity,一般结合 FLAG_ACTIVITY_NEW_TASK 一起使用。

FLAG_ACTIVITY_SINGLE_TOP
等同于在 launcherMode 属性设置为 singleTop。