Activity有四种启动模式:standard、singleTop、singleTask、singleInstance
- standard标准模式:
standard模式是系统的默认模式,每次启动一个Activity都会创建一个新的实例,不管实例是否已经存在。每创建一个实例,都会执行一遍Activity的onCreate()、onStart()、onResume()
方法。
一个任务栈可以有多个实例,每个实例也可以属于不同的任务栈。
谁启动了这个Activity,就会存在于谁的任务栈中。 - singleTop栈顶复用模式:
如果新的Activity已经位于任务栈的栈顶,重新启动该Activity时,不会被重新创建,即onCreate()、onStart()
方法不会调用,会回调onNewIntent()
方法,通过onNewIntent()
的参数,可以获得当前请求的信息。如果该Activity不是位于栈顶,仍然会重新创建。 - singleTask栈内复用模式:
是一种单实例模式,只要启动的Activity在栈中,就不会再创建实例,同样会调用onNewIntent()
方法。对于启动模式为singleTask的Activity,在启动时,回先去寻找其所在的任务栈,如果存在,则判断栈内是否存在该实例,如果实例存在,在会调用onNewIntent()
方法,如果不存在,则创建实例并放入栈中。如果栈和实例均不存在,则会创建新的栈和实例。
如果任务栈中存在实例,再次启动时,需要将其放到栈顶,同时会把其上面的Activity出栈。 - singleInstance单实例模式
它是加强版的singleTask模式,具有所有singleTask的特点,并且加强了一点,singleInstance模式的Activity只能单独的存在于一个任务栈中。
什么叫Activity相关的任务栈?
涉及到一个参数TaskAffinity,标识了一个Activity所需的任务栈的名字,默认情况下,均为应用的包名。我们可以指定TaskAffinity属性值,但是必须与所在包名不同,否则,没有效果。
一般TaskAffinity与singleTask 或 allowTaskRePartenting 属性配对使用。
adb命令,抓取Activity
adb shell dumpsys activity
可根据 Run Activity(most recent first)中查看任务栈及Activity信息。