[toc]
Activity介绍
1.Activity
Activity代表了一个单独的屏幕,当内部没有fragment组件时,其通过视图绑定提供视图(View),并通过视图组件的点击等回调函数实现用户和应用交互(Controller)的功能。
如果有fragment时,Activity 成为一个容器,Fragment 担当 UI 和交互逻辑,而Activity 管理 Fragment 的生命周期。即:Activity 提供了一个容器(fragment_container),Fragment 在这个容器中显示具体内容,并负责处理用户交互。
2.任务:
任务 是由一组 Activity 组成的集合,代表用户当前正在进行的一项工作。其使用栈的结构来组织activity。
举例说明:
假如当前用户执行一个购物的任务,那么其任务栈如下:
-
打开应用:
-
你启动电商应用,
MainActivity显示商品列表。 -
任务栈内容:
MainActivity
-
-
浏览商品详情:
-
你点击某个商品,启动
ProductDetailActivity,显示商品的详细信息。 -
任务栈内容:
ProductDetailActivity MainActivity
-
-
查看购物车:
-
你点击“查看购物车”按钮,启动
CartActivity,显示购物车中的商品。 -
任务栈内容:
CartActivity ProductDetailActivity MainActivity
-
-
进行结账:
-
你点击“结账”按钮,启动
CheckoutActivity,进行结账操作。 -
任务栈内容:
CheckoutActivity CartActivity ProductDetailActivity MainActivity
-
Activity 生命周期
Activity 在系统中存在时分为三个维度:可存在(activity资源被加载进内存中),可见,可交互。
可交互则为是否可以与用户操作;可见则为是否显示在屏幕上;可存在,则为该activity是否被系统杀死或者调用了finish方法(也可以理解为:activity的资源是否在内存中存储)。
具体如下图:
其中比较关键的是OnCreate,我们在这里面通常会调用 setContentView() 设置 Activity 的布局。
启动模式
启动模式(Launch Modes)指的是在当前已有activity的情况下,去启动一个新的 Activity 时,系统如何管理任务栈。
启动模式(Launch Modes)
-
standard:这是默认的启动模式。在这种模式下,每次启动一个 Activity 都会创建它的一个新实例,无论栈中是否已经存在该 Activity 的实例。
-
singleTop:如果所启动的 Activity 已经位于任务栈的栈顶,则重用栈顶的 Activity 实例,并调用其
onNewIntent()方法;否则,创建新的实例。 -
singleTask:如果所启动的 Activity 已经存在于任务栈中,则该 Activity 及其上的所有 Activity 实例被清除,只保留该 Activity 实例,并调用其onNewIntent()方法。 -
singleInstance**:创建一个新的任务栈,并在里面创建新的activity。
(任务栈1) DetailActivity -> MainActivity -> DetailActivity -> SettingsActivity (任务栈2) MainActivity本文将图文的模式来讲解 启动模式`的作用及区别。首先需要来讲解以下图片的作用来帮助你更容易理解下面的内容
绿色代表在 Activity 任务栈中创建了一个新的 Activity 实例 黄色则代表复用了之前创建的 Activity 实例,但是该 Activity 的
onNewIntent()方法将会被调用
Standard 启动模式讲解
如果在
AndroidManifest.xml中将 Activity B 的启动模式设置为 Standard,不管任务栈内是否已经存在 Activity B 的实例,当启动 Activity B 时,都会创建一个崭新的 Activity B 位于任务栈顶
SingleTask 模式讲解
如果在
AndroidManifest.xml中将 Activity C 的启动模式设置为 SingleTask,如果此时任务栈内已经存在 Activity C 的实例且未位于栈顶,当启动 Activity C 时,会将 Activity C 上方的实例全部出栈让其位于任务栈顶并 Activity C 中的onNewIntent()方法会被调用
如果在
AndroidManifest.xml中将 Activity C 的启动模式设置为 SingleTask,并且此时任务栈内并不存在 Activity C 的实例,当启动 Activity C 时,会创建一个崭新的 Activity C 实例在栈顶
SingleTop 启动模式讲解
如果在
AndroidManifest.xml中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内存在 Activity D 实例且位于栈顶时,当启动 Activity D 时,会复用之前创建的 Activity D 的实例,并且onNewIntent()方法被调用
如果在
AndroidManifest.xml中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内并不存在 Activity D 的实例时,当启动 Activity D 时,会创建一个崭新的 Activity D 实例在栈顶
如果在
AndroidManifest.xml中将 Activity D 的启动模式设置为 SingleTop 并且任务栈内存在 Activity D 的实例但其实例未在栈顶时,当启动 Activity D 时,会再次创建一个崭新的 Activity D 实例在栈顶
SingleInstance 模式讲解
如果在
AndroidManifest.xml中将 Activity E 的启动模式设置为 SingleInstance,并且任务栈内不存在 Activity E 的实例,当启动 Activity E 时,会在创建一个新的任务栈,并且栈内只有 Activity E 一个实例
如果此时基于上面的任务栈,从 Activity D 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发生什么样的变化呢?请看下图
此时 Activity E 依旧会独立的存在于自己的任务栈中,而新创建的 Activity F 将会和 Activity D 位于相同的任务栈的栈顶
如果启动模式为
SingleInstance的 Activity E 已经独立存在于自己的任务栈中,此时再启动 Activity E, 则会复用已经创建的 Activity E 的实例,并且 Activity E 的onNewIntent()方法被调用
如果基于上面的任务栈,从 Activity E 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发什么样的变化呢,请看下图
因为
singleInstance的属性是禁止与其他 Activities 共享任务栈,所以启动模式为SingleInstance的 Activity 启动其他 Activity 时会默认带有FLAG_ACTIVITY_NEW_TASK属性。所以 Activity E 启动 Activity F 后,最后会存在三个任务栈,Activity F 会单独存在于一个任务栈中