Android开发艺术探索读书笔记

第一章    Activity的生命周期和启动模式

1.2  Activity的启动模式

   Activity有四种启动模式:

(1)standard:标准模式。每次启动一个Activity(B)就会创建一个新的实例,并放入启动它的Activity(A)所在的任务栈中(关于任务栈,可以想象成一个有底的桶,具有先进后出,后进先出的特点),越早创建的Activity实例越靠近桶的底部,那最先出栈的就是后创建的且靠近栈顶的Activity实例,

        在其他地方也看过一个形象的比喻就是:吃饭吃吐了,吐出来的都是后面吃进去的食物,虽然画面太美,不能想象,但是比喻那是相当贴切。


(2)singleTop:  栈顶复用模式。就是在创建一个Activity实例的时候,先看看栈顶是不是存在该Activity的实例,如果不存在,那就创建;如果存在了,那就歇着,不用再重复创建,直接用就行了。那么应该怎么直接用呢,生命周期方法还要重新执行吗?当然是不用重复执行onCreate,onStart方法了,如果重复执行了,那跟重新创建一个新的实例有啥区别, 所以这个模式会走一个新的方法onNewIntent(Intent intent)方法,我们可以在这里面执行一些启动界面的逻辑。


(3)singleTask:栈内复用模式。是一种单实例模式。这个感觉要比singleTop要眼界宽泛的多了,创建Activity的时候,不再只局限于瞅一眼栈顶存不存在该Activity的实例,而是放眼整个任务栈,这个概念对于是同一个任务栈还是不同的任务栈来说都是一样,不存在任务栈就老老实实创建任务栈,指定的任务栈中不存在Activity的实例就老老实实创建,不用想着复用。如果说指定的栈内存在有实例,那么就把这个实例之上的其他Activity的实例清空掉(clearTop功能),造成了把目标Activity移到栈顶的假象,并且直接复用这个实例就好了。总而言之,目标任务栈中只要有目标Activity的实例,就拿来用,而且不会重复执行生命周期方法,而是会执行新的方法onNewIntent(Intent intent)这个与singleTop逻辑一样。


(4)singleInstance:单实例模式。以此标识启动模式的Activity,在创建实例的时候,会创建一个新的任务栈,且这个任务栈只有一个此Activity的实例,如果再次创建实例,那么就会复用这个栈内已有的实例对象,复用逻辑跟singleTask的相同。也是执行onNewIntent(Intent intent) 方法

上面经常提到任务栈,什么是任务栈呢?任务栈就是一种后进先出的数据结构,管理着栈名相同的所有Activity,一个应用默认有一个任务栈,且栈名就是包名,如果想给特定的Activity指定栈名,可以再注册Activity的时候添加taskAffinity属性,且不能和当前的包名重复。这样启动该Activity时,就会进入指定栈名的任务栈中。

如何给Activity指定启动模式?有两种。一种就是在清单文件中注册Activity的时候,添加属性launchMode这个值就是上面指定的四种,默认是standard,可以不写。

第二种就是在在代码中动态注册了

在跳转代中给intent添加flag        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

未完待续。。。

你可能感兴趣的:(Android开发艺术探索读书笔记)