管理 Activity 的 Task 一

以下内容来自官方文档「Understand Tasks and Back Stack - Managing Tasks」的手动翻译

像之前描述的那样,Android 通过 Task 和 Back Stack 的方式很好的管理了大多数应用,并且我们不用关心应用的 Activities 是如何和 Task 关联的,在 Back Stack 里如何管理。不过,我们可以改变这种默认的行为方式,或许你想让一个 Activity 启动时就创建一个新的 Task 而不是默认在当前 Task 中启动,或许在启动 Activity 时,你想复用之前已在 Back Stack 里的实例,而不是再一次创建新的实例,又或许当用户离开这个 Back Stack 时,你只想留住栈底的 Activity,其他都不要。

你可以通过配置 manifest 文件里的 < activity > 节点属性并配合 startActivity() 方法的 intent 入参标记来做更多想上述那样的事。

< activity > 属性里和这相关的属性主要有:

  • taskAffinity
  • launchMode
  • allowTaskReparenting
  • clearTaskOnLaunch
  • alwaysRetainTaskState
  • finishOnTaskLaunch

intent 中和这相关的标记主要有:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP

通过上述的属性及标记的使用,我们可以控制 Activities 与 Task 的关联以及他们在 Back Stack 里的行为。

「但是,最近使用的那个页面(就是长按 Home 健或者从屏幕底部上滑出来的那个可以选择近期使用过的应用的页面)我们要单独考虑,官方建议最后不要改变,让系统自己管理」

指定启动方式

通过设置 Activity 的启动方式,能改变 Activity 与其关联的 Task 的行为方式。

  • 通过 manifest 文件
    当在 manifest 文件里定义 Activity 时,我们能指定其启动方式,这决定了它如何关联 Task。

  • 通过 Intent 标记
    当调用 startActivity() 方法时,也可通过 Intent 的标记来指定 Activity 和 Task 的关联。

注意,有些方式只能通过 manifest,有些则只能通过 Intent 标记,所以不要两种方式结合考虑。

通过 manifest 文件

在 < activity > 节点下可通过 launchMode 属性进行配置。
launchMode 属性决定了 Activity 是如何被启动的,这里有四种启动方式:
"standard" (默认方式)
"singleTop"
"singleTask"
"singleInstance"
各方式的简述可参看 我问你答-简述 Activity 的启动方式

注意,当通过 Intent 标记配置启动方式时,manifest 里配置的属性将失效。

通过 Intent 标记

FLAG_ACTIVITY_NEW_TASK
在新 Task 里启动 Activity。如果现有 Task 里已经有了这个 Activity,那么这个 Task 会被调到前台,调用 onNewIntent(),并恢复 Activity 的状态。这和 "singleTask" 的启动方式时一样的。

FLAG_ACTIVITY_SINGLE_TOP
如果要启动的 Activity 是在当前栈顶,则不会新建实例,而是调用 onNewIntent() 方法。这和 "singleTop" 是一样的。

FLAG_ACTIVITY_CLEAR_TOP
如果当前 Task 里已经有某个 Activity,此时通过这种方式启动,将会把这个 Activity 之上的 Activity 出栈销毁,并调用 onNewIntent() 方法。这种方式 launchMode 里没有对应的。

通常这个标记会和 FLAG_ACTIVITY_NEW 一起用。如果一起用,就可以在其他 Task 里找到该 Activity 并调用 onNewIntent() 方法。

你可能感兴趣的:(管理 Activity 的 Task 一)