任务和返回栈
任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中。返回时堆栈按照后进先出的顺序移除Activity。
adb shell dumpsys activity---------------查看ActvityManagerService 所有信息
adb shell dumpsys activity activities----------查看Activity组件信息
adb shell dumpsys activity services-----------查看Service组件信息
adb shell dumpsys activity providers----------产看ContentProvider组件信息
adb shell dumpsys activity broadcasts--------查看BraodcastReceiver信息
adb shell dumpsys activity intents--------------查看Intent信息
adb shell dumpsys activity processes---------查看进程信息
指定 lanuchMode 指定启动模式
在清单文件中声明 Activity 时,使用activity 元素的launchMode 属性指定 Activity 应该如何与任务关联。
standard(默认模式)
默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
singleTop
如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent()方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。
关于singleTop一个典型的使用场景就是搜索功能。假设有一个搜索框,每次搜索查询都会将我们引导至SearchActivity查看结果,为了更好的交互体验,我们在结果页顶部也放置这样的搜索框
singleTask
系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的onNewIntent()。
singleInstance
这个模式和singleTask差不多,因为他们在系统中都只有一份实例。唯一不同的就是存放singleInstance Activity实例的Task只能存放一个该模式的Activity实例。如果从singleInstance Activity实例启动另一个Activity,那么这个Activity实例会放入其他的Task中。同理,如果singleInstance Activity被别的Activity启动,它也会放入不同于调用者的Task中。
eg
现有如图四种启动模式的4个Activity
standard->singleInstance->singleTask
返回的顺序为 singleTask->standard->singleInstance
adb shell dumpsys activity 查看堆栈信息
SingleTaskActivity 和 StandardActivity 在一个 Task 中,SingleInstance 在单独的一个堆栈中
使用Intent标志
FLAG_ACTIVITY_NEW_TASK
在新任务中启动 Activity。如果已为正在启动的 Activity 运行任务,则该任务会转到前台并恢复其最后状态,同时 Activity 会在onNewIntent()中收到新 Intent。正如前文所述,这会产生与 "singleTask" launchMode值相同的行为。
FLAG_ACTIVITY_SINGLE_TOP
如果正在启动的 Activity 是当前 Activity(位于返回栈的顶部),则 现有实例会接收对 onNewIntent()的调用,而不是创建 Activity 的新实例。正如前文所述,这会产生与 "singleTop" launchMode值相同的行为。
FLAG_ACTIVITY_CLEAR_TOP
如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent()将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例。产生这种行为的launchMode属性没有值。
FLAG_ACTIVITY_CLEAR_TOP通常与 FLAG_ACTIVITY_NEW_TASK
结合使用。一起使用时,通过这些标志,可以找到其他任务中的现有 Activity,并将其放入可从中响应 Intent 的位置。
注:**如果指定 Activity 的启动模式为 "standard"
,则该 Activity 也会从堆栈中删除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 "standard"
时,将始终为新 Intent 创建新实例。
小结
standard 都新建实例
singleTop 在栈顶就复用
singleTask 在栈内复用,如果不在栈顶就删除上面所以实例
singleInstance 单独一个栈,此栈只有这一个实例