一、Activity的启动模式有四种:standard(默认)、singleTop(栈顶复用)、singleTask(栈内复用)、singleInstance(单例模式)
使用方法:
在清单文件中声明 Activity 时,可以使用 < activity>
元素的 launchMode
属性指定 Activity的启动模式
1.standard:默认的标准启动方式,Activity可以被多次实例化,创建多个Activity实例。(被启动的activity与启动的activity在同一个任务栈)
注意:用ApplicationContext去启动standard模式的Activity会报错,这是因为此模式的Activity默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并有没有任务栈。
解决办法:启动Activity时指定FLAG_ACTIVITY_NEW_TASK即可
2.singleTop:如果栈顶已经有该实例,那么就会复用,并调用onNewIntent()方法。如果不在栈顶,则会创建。(被启动的activity与启动的activity在同一个任务栈)
3.singleTask:与Intent.FLAG_ACTIVITY_NEW_TASK效果相同,只允许一个栈中只存在一个该Activity的实例,如果栈中没有该Activity的实例,则会创建。如果栈中已经存在,系统会销毁在这之上的所有Activity,让该Activity实例置于栈顶,并调用onNewIntent()方法。(Activity所在的任务栈为taskAffinity设置的栈名,若没有设置,则任务栈为该Activity所在进程的包名)
4.singleInstance:只在一个独立的任务栈中,并且这个任务栈中有且只有这一个实例。重复启动该Activity时,会重用已存在的任务和实例,并调用onNewIntent()。(Activity所在的任务栈为taskAffinity设置的栈名,若没有设置,则任务栈为该Activity所在进程的包名。若该应用有多个Activity,且都没有设置taskAffinity时,则启动每一个Activity 都创建一个新的任务栈,任务栈的栈名都是应用包名,但是有不同的任务栈id)
singleInstance和singleTask的区别:
1.singleInstance在系统中只会存在一个实例,而singleTask模式的Activity可以有多个实例(在不同的任务栈中)。
2.多个应用启动同一个singleInstance的Activity,都会重用已经启动的实例。
二、生命周期:
Activity完整的生命周期:onCreate()->onStart() ->onResume() ->onPause() ->onStop()->onDestory()
1.息屏再重新亮屏,或者按下Home键,再重新进入应用时(应用没被杀后台的前提下)。
onPause() -> onStop() -> onRestart() ->onStart() ->onResume()
这种情况下,与启动模式无关
2.假设Activity A位于栈顶,此时再启动Activity A。
①启动模式是 Standard:
生命周期:onPause() ->onCreate()->onStart() ->onResume() ->onStop()
②启动模式是 SingleTop、SingleTask 或者 SingleInstance的话:
生命周期:onPause() -> onNewIntent() -> onResume()