01. Activity

246 阅读5分钟

[toc]

Activity介绍

1.Activity

Activity代表了一个单独的屏幕,当内部没有fragment组件时,其通过视图绑定提供视图(View),并通过视图组件的点击等回调函数实现用户和应用交互(Controller)的功能。

如果有fragment时,Activity 成为一个容器,Fragment 担当 UI 和交互逻辑,而Activity 管理 Fragment 的生命周期。即:Activity 提供了一个容器(fragment_container),Fragment 在这个容器中显示具体内容,并负责处理用户交互。

2.任务:

任务 是由一组 Activity 组成的集合,代表用户当前正在进行的一项工作。其使用栈的结构来组织activity。

举例说明:

假如当前用户执行一个购物的任务,那么其任务栈如下:

  1. 打开应用

    • 你启动电商应用,MainActivity 显示商品列表。

    • 任务栈内容:

      MainActivity
      
  2. 浏览商品详情

    • 你点击某个商品,启动 ProductDetailActivity,显示商品的详细信息。

    • 任务栈内容:

      ProductDetailActivity
      MainActivity
      
  3. 查看购物车

    • 你点击“查看购物车”按钮,启动 CartActivity,显示购物车中的商品。

    • 任务栈内容:

      CartActivity
      ProductDetailActivity
      MainActivity
      
  4. 进行结账

    • 你点击“结账”按钮,启动 CheckoutActivity,进行结账操作。

    • 任务栈内容:

      CheckoutActivity
      CartActivity
      ProductDetailActivity
      MainActivity
      

Activity 生命周期

Activity 在系统中存在时分为三个维度:可存在(activity资源被加载进内存中),可见,可交互。

可交互则为是否可以与用户操作;可见则为是否显示在屏幕上;可存在,则为该activity是否被系统杀死或者调用了finish方法(也可以理解为:activity的资源是否在内存中存储)。

具体如下图:

8a03ac58e9c049e98a0a671dfc8b54f9tplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp

其中比较关键的是OnCreate,我们在这里面通常会调用 setContentView() 设置 Activity 的布局。

启动模式

启动模式(Launch Modes)指的是在当前已有activity的情况下,去启动一个新的 Activity 时,系统如何管理任务栈。

启动模式(Launch Modes)

  1. standard:这是默认的启动模式。在这种模式下,每次启动一个 Activity 都会创建它的一个新实例,无论栈中是否已经存在该 Activity 的实例。

  2. singleTop:如果所启动的 Activity 已经位于任务栈的栈顶,则重用栈顶的 Activity 实例,并调用其 onNewIntent() 方法;否则,创建新的实例。

  3. singleTask :如果所启动的 Activity 已经存在于任务栈中,则该 Activity 及其上的所有 Activity 实例被清除,只保留该 Activity 实例,并调用其 onNewIntent() 方法。

  4. singleInstance**:创建一个新的任务栈,并在里面创建新的activity。

    (任务栈1) DetailActivity -> MainActivity -> DetailActivity -> SettingsActivity
    (任务栈2) MainActivity
    

    本文将图文的模式来讲解 启动模式`的作用及区别。首先需要来讲解以下图片的作用来帮助你更容易理解下面的内容

image.png

绿色代表在 Activity 任务栈中创建了一个新的 Activity 实例 黄色则代表复用了之前创建的 Activity 实例,但是该 Activity 的 onNewIntent() 方法将会被调用

Standard 启动模式讲解

image.png

如果在 AndroidManifest.xml 中将 Activity B 的启动模式设置为 Standard,不管任务栈内是否已经存在 Activity B 的实例,当启动 Activity B 时,都会创建一个崭新的 Activity B 位于任务栈顶

SingleTask 模式讲解

image.png

如果在 AndroidManifest.xml 中将 Activity C 的启动模式设置为 SingleTask,如果此时任务栈内已经存在 Activity C 的实例且未位于栈顶,当启动 Activity C 时,会将 Activity C 上方的实例全部出栈让其位于任务栈顶并 Activity C 中的 onNewIntent() 方法会被调用

image.png

如果在 AndroidManifest.xml 中将 Activity C 的启动模式设置为 SingleTask,并且此时任务栈内并不存在 Activity C 的实例,当启动 Activity C 时,会创建一个崭新的 Activity C 实例在栈顶

SingleTop 启动模式讲解

image.png

如果在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内存在 Activity D 实例且位于栈顶时,当启动 Activity D 时,会复用之前创建的 Activity D 的实例,并且 onNewIntent() 方法被调用

image.png

如果在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内并不存在 Activity D 的实例时,当启动 Activity D 时,会创建一个崭新的 Activity D 实例在栈顶

image.png

如果在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内存在 Activity D 的实例但其实例未在栈顶时,当启动 Activity D 时,会再次创建一个崭新的 Activity D 实例在栈顶

SingleInstance 模式讲解

image.png

如果在 AndroidManifest.xml 中将 Activity E 的启动模式设置为 SingleInstance,并且任务栈内不存在 Activity E 的实例,当启动 Activity E 时,会在创建一个新的任务栈,并且栈内只有 Activity E 一个实例

如果此时基于上面的任务栈,从 Activity D 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发生什么样的变化呢?请看下图

image.png

此时 Activity E 依旧会独立的存在于自己的任务栈中,而新创建的 Activity F 将会和 Activity D 位于相同的任务栈的栈顶

image.png

如果启动模式为 SingleInstance 的 Activity E 已经独立存在于自己的任务栈中,此时再启动 Activity E, 则会复用已经创建的 Activity E 的实例,并且 Activity E 的 onNewIntent() 方法被调用

如果基于上面的任务栈,从 Activity E 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发什么样的变化呢,请看下图

image.png

因为 singleInstance 的属性是禁止与其他 Activities 共享任务栈,所以启动模式为 SingleInstance 的 Activity 启动其他 Activity 时会默认带有 FLAG_ACTIVITY_NEW_TASK 属性。所以 Activity E 启动 Activity F 后,最后会存在三个任务栈,Activity F 会单独存在于一个任务栈中

启动过程