Android使用栈来管理Activity(Task 和 BackStack)。
manifest中的四种launch-mode
- standard(Activity默认的启动模式)
- 每次启动都会重新创建一个实例,不管这个Activity在栈中是否已经存在;
- 谁启动了这个Activity,那么Activity就运行在启动它的那个Activity所在的栈中;
- 用Application去启动Activity时会报错,提示非Activity的Context没有所谓的任务栈。解决 办法是为待启动Activity制定FLAG_ACTIVITY_NEW_TASH标志位,这样就会为它创建 一个新的任务栈。(Android7.0之后也可以直接用application启动Activity)
- singleTop
- 如果新Activity位于任务栈的栈顶,那么此Activity不会被重新创建,同时调用 onNewIntent 方法,此时的生命周期:onPause() -> onNewIntent() -> onResume() ;
- 如果新Activity已经存在但不是位于栈顶,那么新Activity仍然会被创建。
- singleTask
- 这是一种单实例模式
- 只要Activity在栈中存在,那么多次启动这个Activity都不会重新创建实例,同时也会调用 onNewIntent 方法,此时的生命周期有两种,当待启动Activity在栈顶时:onPause() -> onNewIntent() -> onResume() ; 不在栈顶时:onNewIntent() -> onStart() -> onResume() 。
- 同时会导致在Activity之上的栈内Activity出栈。
- singleIntance
- 具有singleTask模式的所有特性,同时具有此模式的Activity只能单独的位于一个任务栈中
可以看出启动模式为singleInstance的SingleInstanceActivity属于一个独立的Task。
- 具有singleTask模式的所有特性,同时具有此模式的Activity只能单独的位于一个任务栈中