Android Activity Stack

2017/08/10 Android

ActivityStackSupervisor负责处理Activity的启动模式和Intent Flag。

系统里有多个Stack,每个Stack里有多个Task,每个Task里面有多个Activity。Stack貌似只有两个,一个是HomeStack,一个是ApplicationStack。

如果Activity的LaunchMode是SingleTask,那么切换到后台再切换到前台时,就会把它上面的Activity都finish掉。

在最近程序中点击一个程序图标,会调用moveTaskToFront将程序的整个Task切换到前台。但在桌面上点击一个图标会会调用startActivity启动这个程序。

Intent.FLAG_ACTIVITY_FORWARD_RESULT意义是:A通过startActivityForResult启动B,B在启动C时带上FLAG_ACTIVITY_FORWARD_RESULT,那么本来应该由B给A回传Result,但现在B把这个责任转交给了C,由C给A回传Result。

Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_MULTIPLE_TASK始终在一个新的Task中启动Activity,而不管之前是否有以这个Activity启动的Task。但是如果Activity的LaunchMode是SingleTask或SingleInstance,会忽略掉Intent.FLAG_ACTIVITY_MULTIPLE_TASK标志。

如果以不同的Intent启动同一个Activity,虽然这个Activity是通过FLAG_ACTIVITY_NEW_TASK启动的,并且是Task的Root,但是还是会启动一个新Task并启动新的Activity。

通过Intent.FLAG_ACTIVITY_REORDER_TO_FRONT可以调整Task里面Activity的顺序,但这个标志只会影响同一个Task里面的Activity,并且launchMode是singleTask或singleInstance的Activity不会受到这个标志的影响。

Android的多任务模型可能是从单任务模型发展起来的,最简单的单任务模型只需要一个Back Stack,所有启动的Activity都会在放到Stack Top位置,按返回键弹出栈顶的Activity,显示下面的Activity。但在某些情况下这种单任务模型并不凑效,例如用户按下Home键,系统会把Home Activity上面的所有Activity弹出栈。用户之前进行的任务没有保存,不能继续之前的任务,只能重新开始。这对用户来讲体验非常糟糕,因此Android引入多任务来解决这个问题,用Task来组织Activity,现在Back Stack里面存放的不是Activity,而是Task,Task里面存放的是才是Activity。并且Back Stack里面的Task可以直接调整顺序,比如按下Home键,系统会直接把Home Activity所在的Task调整到栈顶,其他任务调整到它的下面,不会被销毁,用户想切换到之前的任务,直接把那个任务调到栈顶,这样用户就可以继续之前的任务了。

默认情况下,所有的Activity都会放在同一个Task里面,这样就退化成单任务模型。因此系统提供NEW_TASK Intent标志,用来将启动的Activity放在一个新的任务里面。Home程序中启动所有应用程序界面都加了这个标志,因此从Home启动的所有应用程序Activity都在他们自己的Task里面,这样在不同的应用程序之间直接切换非常方面。在切换时如果之前存在Task就把这个Task移动到栈顶,如果不存在就在创建一个Task并放在栈顶,因此NEW_TASK标志并不是始终创建新的Task,而是看这个Task是否已经存在了,如果存在了就将这个Task移动到栈顶,如果不存在就创建这个Task并放入栈顶。

启动一个Activity要求回传结果,这个Activity必须和调用者在同一个Task中,否则调用者会收到RESULT_CANCELED

Search

    Post Directory