Activity启动模式
在说activity启动模式之前,我们要先了解activity栈的概念。activity任务栈是一个“后进先出”的栈结构。即启动一个新activity实例时会将其压入栈顶,当该activity按返回键退出时,其实例会从任务栈中出栈。任务栈分为前台任务栈和后台任务栈,后台任务栈中的activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。
activity的启动模式就是配合栈的工作原理,来满足日常的业务需要。activity启动的模式有四种:standard、singleTop、singleTask和singleInstance。standard就是activity默认的启动模式。
standard:标准模式(默认模式)
这种模式下的activity每次启动都会创建一个新的实例,并且不管该实例是否在任务栈内存在都会压栈。如果activityA和activityB都是标准模式,activityA启动了activityB,这时候栈顶是activityB,下面是activityA。
标准模式的activity默认会进入启动它的activity所属的任务栈中,非activity类型的Context若要启动该activity,需要加上标记位FLAG_ACTIVITY_NEW_TASK,即重新为其创建一个新的任务栈。此标志位的启动模式实际上是以singleTask模式启动的。(后续会解释,这里先跳过标记位知识点)
命令行查看栈内activity列表信息
例:在同一APP内且没有标记位情况下,执行跳转activityA——activityB——activityC——activityA,他们都是标准模式。理论上栈内应为ABCA。
命令行执行:
adb shell dumpsys activity
命令行查询栈信息时里面的信息非常多且杂,这里主要看
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
该行下面的信息即可,即 Hist #3:—— Hist #2:—— Hist #1:—— Hist #0:,栈内从上到下的的显示顺序,Hist #3位于栈顶。
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
Stack #1:
Task id #319
TaskRecord{
22fe5578 #319 A=com.jzf.myactivity U=0 sz=4}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.jzf.myactivity/.ActivityA }
Hist #3: ActivityRecord{38af6616 u0 com.jzf.myactivity/.ActivityA t319}
Intent { cmp=com