<activity android:name=".MainActivity" android:launchMode="singleTask">。
standard模式:标准模式,Android activity默认的启动模式如果不指定启动模式,特点是每启动一个activity就会将启动的activity压入栈中,不会去看目前栈中是否有相同的activity在栈中。
singleTop模式:栈顶复用模式,当启动一个activity时并指定其启动模式为singleTop时,如果发现该activity已经处于栈顶的位置,那么将不会再创建新的activity实例,而是直接调用onNewIntent(),直接使用处于栈顶的activity(不会走onCreate,因为没有重新创建实例)避免像standard模式一样重复创建;应用场景:比如,你从activity启动了个service进行耗时操作,或者某种监听,这个时候你按home键返回到home了,service收集到信息,要返回activity了,就用singleTop启动,实际不会创建新的activityA,只是resume了;再比如:比如在activity A下在通知栏点击某个东西后需要启动一个activity A,这个就要用到这个模式,否则的话每次点击都会新建一个activity A,会出现问题。
singleTask模式:栈内复用模式,如果要启动的activity已经在栈内(无论是栈顶还是栈内),则复用这个已经存在的activity,并将在此activity之上的所有activity全部出栈,并调用onNewIntent()。
应用场景:
1.taskAffinity属性为非默认值
singleTask这个属性一般和taskAffinity这个属性一起使用,例如当你的应用处于运行状态时,home键使得进入后台,这时再使用另外一个应用启动第一个应用的某一个页面(比如QQ),启动后按back键返回后,返回后显示的页面是第一个应用的页面。而需求是在保证kill第一个应用下返回键后显示的是第二个应用的界面。这个时候将要被启动的activity的launchMode设置为singleTask,taskAffinity设置为第二个应用的包名,这样就能满足需求了。因为设置完这两个属性后启动activity后,activity是在第二个应用的栈中。
2.taskAffinity属性为默认值
taskAffinity属性默认值是自身应用的包名,当taskAffinity属性为默认值时的经常使用场景是在进入很多层后返回首页操作,这样设置singleTask属性后,直接将首页上的所有activity全部出栈,首页处于栈顶。
singleInstance模式:全局复用模式,如果要启动的activity没有被启动,则新建一个栈并将activity压入栈中;如果activity已经压入栈中,则将此activity之上的activity全部出栈,并调用onNewIntent()。这里面的栈是全局可见的,是一个单独的栈,功能与singleTask模式下taskAffinity属性值为非默认值时一样,只是singleInstance模式是将要启动的activity放在一个单独的栈,而singleTask+taskAffinity(非默认值)是将activity压入启动它的栈中。