Activity的启动模式一共有四种,分别为 standard,singleTop,singleTask,singleInstance。
可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。
设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置Android:launchMode属性。
下面详细介绍四种模式:
1.standard
standard模式是默认的启动模式,每次startActivity都是创建一个新的activity的实例, 适用于绝大大数情况。
不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。
2.singleTop
单一顶部,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例, 而是调用 onNewIntent() 方法。
比如:
现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
singletop 这个可以用来避免多次创建,比如点击一个按钮启动一个activity,如果快速点击多次会导致反复启动,一种办法是在点击事件里过滤,另一个办法是设置目标activity是singletop。
3.singleTask
单一任务栈 , activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空当前activity任务栈上面所有的activity
注意: activity还是运行在当前应用程序的任务栈里面的。不会创建新的任务栈。
比如:
现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
应用场景:浏览器activity, 整个任务栈只有一个实例,节约内存和cpu的目的。
4.singleInstance
单一实例,整个手机操作系统里面只有一个实例存在。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。与singleTask不同的是singleInstance会新建一个任务栈,这个任务栈只有这么一个实例,而singleTask不会创建新的任务栈。
应用场景:呼叫来电界面 ,不同的应用去打开这个activity 共享同一个activity。