ActivityStackSupervisior管理ActivityStack:ActivityStack就是回退栈,分为系统和应用,id为0的是系统的回退栈,id为1的是应用的回退栈。
ActivityStack管理着TaskRecord,也就是任务栈
TaskRecord管理着ActivityRecord
一般在点击手机Back键的时候就是在当前任务栈返回,返回到最底下一个activity时,就返回桌面(最底下的activity是从桌面图标启动的),而不是返回其他的任务栈,因为一个任务栈大致就可以代表一个应用,如果退完一个应用就进入另一个应用会非常奇怪。如果最底下的那个activity是从另一个应用启动的,那么就会返回到那个应用的顶层,但如果在按back键之前,现将启动它的那个应用返回桌面,那么再返回被启动的应用时也将是返回桌面。
关于上一条其实可以这么理解:桌面和最近列表其实是一个大的回退栈,是系统的,当我们点击home或者最近列表时,大的回退栈就将上面所有的应用的回退栈弹栈。而我们的每个应用都有且只有一个回退栈,这个回退栈是记录任务的。比如我们点击一个应用图标,那么这个应用就会新建一个回退栈,并且这个回退栈是在系统的大的回退栈上面的,我们不用管系统的,我们现在只管自己应用的回退栈,此时,在应用中点击打开另一个任务,那么这个任务就会压入回退栈,点击back键就回到上一个任务,再点击就回到桌面。
一个应用启动另一个应用的界面,会有seamless机制,即启动的另一个应用的activity模式是standard和singleTop,那么就会是这个模式;但是如果它是singleTask或者singleInstance模式,那么就不是这样,而是相当于开启另一个任务栈。
一个任务栈的任务名就是最底层那个activity的taskAffinaty属性。任务栈的任务名可以重名,不过任务id不会重名,不过如果任务名重名,在最近列表里可不会显示两个相同任务名的任务。
点击应用图标就是找到这个应用的入口activity,先查看它的taskAffanity属性所属任务存不存在,存在的话直接将这个任务放置前台,不存在就启动这个activity
一切从Activity出发,开启了这个应用的activity,就是开启了这个应用的进程,但是并不一定开启了这个应用的任务
回退栈不会回退任务,而是直接返回桌面,除非这个任务是由另一个任务启动的。
activity就是封装的窗口,而ActivityRecord、TaskRecord、ActivityStack、ActivityStackSupervisior这些只是为了对窗口的切换进行管理。扩展一下,WindowsManager、WindowsManagerService、SurfaceFlinger是对增加窗口进行管理。
回退栈的理解:
应用、窗口、任务、回退栈这几者的关系要弄清楚:
可能应用无窗口;
可能应用有窗口了但是没有任务
每个应用都有一个回退栈
回退栈的运行是不影响任务的存在,有可能回退栈里有3个任务,一一回退到桌面,但是打开最近列表,这3个任务依旧还在。考虑回退栈的时候就考虑回退栈,考虑任务的时候就考虑任务,千万不要把他们联系在一起考虑
任务栈的理解:
1、任务可以同名,但是taskId不同,他们依然是两个不同的任务,不过在最近列表中会将同名的任务展示在一起