Activity的四种启动模式分析

来源:互联网 发布:安卓备份软件 编辑:程序博客网 时间:2024/06/06 10:48

        在介绍启动模式之前,我们先谈一个概念taskAffinity,每一个activity都存在该属性,标识了这个activity运行在哪个task中,或者理解为activity和task的依附关系。这个属性表示了activity希望进入的task,如果一个activity没有显式的指明taskAffinity,那么activity的该属性等于其所在application指明的该属性,如果其所在的application也未指明该属性,则其值就是包名。

        进入正题,activity的四种启动模式:

        standard,

        singleTop,

        singleTask,

        singleInstance.

standard模式(默认模式):

        该模式是默认的标准启动模式,在该模式下的activity,每一次启动一次都会重写创建一个新实例,而不管该实例存在与否,每次启动都会依次执行activity的相关方法:onCreate(),onStart(),onResume()。这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。

singleTop模式(栈顶复用模式):

        该模式下,如果activity已经位于栈顶,那么它不会被重写创建,同时它的onNewIntent()方法被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在activity实例,那么情况与standard模式相同。需要注意的是此时activity的onCreate(),onStart()方法不会被调用,因为它并未发生改变。

        singleTop模式下的三种情况:

        1)当前栈中已经有activity的实例并且位于栈顶时,不会重写创建实例,而是将intent对象作为参数传入,回调onNewIntent()方法。

        2)当前栈中已经有activity实例,但是未处在栈顶,也会重写创建。

        3)当前栈中没有activity实例,此时同standard模式。

注意:standard和singleTop模式都是在原来任务堆栈中创建activity实例,不会重新创建task,并且前文说到的taskAffinity也不影响。

singleTask模式(栈内复用模式):

        只要栈中存在activity实例,就不会重写创建,无论其是否处在栈顶,若未处在栈顶则移除其上的activity,并且回调onNewIntent方法。而当我们启动SingleTaskActivity ,首先会寻找需要的任务栈是否存在,也就是taskAffinity指定的值,这里就是包名,发现存在,就不再创建新的task,而是直接使用。当该task中存在该Activity实例时就会复用该实例,这就是栈内复用模式。 

       singleTask启动activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈,如果不存在,则会创建一个新的task,并创建新的activity实例入栈到新创建的task中去;如果存在,则查询该任务栈中是否有该activity实例,如果存在实例,则将其上的activity全部移除,并回调onNewIntent方法,如果不存在该activity,则创建activity实例,并入栈。

        此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。

        singleInstance模式(全局唯一模式):

        该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 

        singleInstance模式启动的Activity在系统中具有全局唯一性。


















0 0
原创粉丝点击