Activity堆栈详解

Activity作为Android四大组件之一,承载着显示界面的重要作用。了解Activity的启动模式也尤为重要。


在Android中,Activity一共有四种启动模式,分别为Standard、SingleTop、SingleTask和SingleInstance,设置Activity启动模式的方式是通过Manifest.xml。具体可以查看我的这篇blog:http://blog.csdn.net/linhh90/article/details/50374515


实际上,Android中对Activity的处理是以堆栈形式进行的,堆栈是一种先进后出的数据结构,这里不再解释,需要的朋友请百度。


在Android中,每个Activity都会被放置到堆栈中,一个APP应用启动Main Activity时会创建一个堆栈,并将MainActivity压入到这个堆栈中。但Android中对Activity堆栈有很多种处理方式,其实启动模式就是这些处理方式,用来维护Activity并实现不同的需求。


一个应用可以有多个Activity堆栈,每个堆栈都有他们自己的名字,默认情况下堆栈的名字是该应用的包名,我们可以通过给Activity设置TaskAffinity属性来给该Activity设置放置在哪一个堆栈,TaskAffinity为一个String字符串,结构和包名类型,默认是应用包名,但TaskAffinity属性只对SingleTask模式的Activity和allowTaskReparenting为true的Activity有效,对其他启动模式无效。


在Android中,Activity的启动流程是这样的,首先系统会读取Activity的启动模式和TaskAffinity(堆栈名),如果存在该堆栈,则到该堆栈中进行操作,否则创建这个堆栈。需要注意的是,Android中有两种堆栈,分别是后台堆栈和前台堆栈,怎么理解呢?我们都知道Activity有可见性区分,如果我们的应用不止一个堆栈,那么可见的那个Activity所在的堆栈就是前台堆栈,其他的堆栈则为后台堆栈。并且在Android中,如果启动一个Activity,这个Activity所在的堆栈就会被切换为前台堆栈,其他堆栈则会变为后台堆栈。


比如APP有两个堆栈①和②,①中有AB两个Activity,A在栈顶,②中有CD,C在栈顶,假设所有Activity都为SingleTop模式。这时前台堆栈为①,那么②就为后台堆栈,在内存中的序列就为①②=ABCD,如果这时候启动C,那么内存会把C所在的堆栈②提升为前台堆栈,①变为后台堆栈,内存序列为②①=CDAB。


Standard:Standard是Android中默认的Activity启动模式,该模式下启动该Activity都会在启动它的Activity所在的堆栈中创建一个新的Activity实例。比如在内存中有两个堆栈①②,①有A,②有B,这时A启动一个Standard的C,那么系统就会创建一个新的C并压入到①堆栈,如果B再启动C,那么系统又会创建一个C压入②堆栈。


SingleTop:SingleTop模式下,系统会查找需要操作的堆栈的栈顶是不是需要启动的Activity,如果是就调用该Activity的onNewIntent方法,否则创建该Activity并压入到它所需要的堆栈。需要注意的是它并不会因为启动它的Activity在哪个堆栈而受到改变。


SingleTask:该模式下,系统会查找所需要操作的堆栈内有没有该Activity,有的话就将在它之上的Activity全部弹出堆栈,并调用它的onNewIntent;没有的话就创建一个新的Activity在该堆栈中。SingleTask可以和TaskAffinity完美结合。


SingleInstance:该模式下,系统会自动给该Activity分配一个单独的堆栈,该Activity在这个堆栈中运行,并且整个app只有这一个Activity实例。


如何查看堆栈的情况,可以在控制台输入adb shell dumpsys activity命令,并查看其中的most recent first。

你可能感兴趣的:(Activity堆栈详解)