介绍启动模式(Launch Mode)就必须先说一下任务栈。
1,当程序打开时就创建了一个任务栈,用与存储当前程序的Activity,所有的Activity属于一个任务栈。
2,一个任务栈包含了一个Activity集合,有序的选择哪一个Activty去和用户进行交互;只有一个任务栈的栈顶Activity才可以和用户进行交互。
3,任务栈可以移到后台,并完整的保留每一个Activity的状态,并且有序的给用户列出它们的任务,而且还不丢失它们状态的信息。
4,退出应用程序时:当把所有的任务栈中所有的Activity清除出栈时,任务栈会被销毁,程序退出。
任务栈的缺点:
1,每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差,需要多次点击返回才可以把程序退出。
2,每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余,重复数据太多,会导致内存溢出(OOM)的问题.
为了解决任务栈的缺点问题,Android引入了启动模式(Launch Mode)
启动模式是指当我们跳转一个Activity所设置的一种模式,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity共用一个Task。
Activity总共包含四种Launch Mode
- Standard
- SingleTop
- SingleTask
- SingleInstance
如何配置启动模式?
直接在AndroidManifest.xml中 <activity>标签中 android:launchMode属性配置即可。
四种启动模式及其应用场景
Standard
standard是Activity默认的启动模式,不用配置android:launchMode属性即可,当然也可以指定standard。
如果设置Activity android:launchMode属性为standard,那么每次启动此Activity时,都会创建新的实例,并且置于栈顶,即:不管有没有已存在的实例,都会创建新的实例。
SingleTop
如果设置Activity android:launchMode属性为singleTop,当跳转此页面时,系统会在栈结构中寻找此Activity 是否正位于栈顶,如果有则不在生成新的,而是直接使用,将此Activity显示在屏幕前,如果没有位于栈顶位置则创建新的实例对象。
SingleTask
如果设置Activity android:launchMode 属性为singleTak , 当跳转此页面时,系统会在栈结构中寻找此Activity是否存在,如果存在(不管是否在栈顶),则将此Activity之前的所有Activity出栈,然后显示到屏幕前。如果不存在此栈结构中,那么就重新创建一个新的实例对象。
SingleInstance
如果设置Activity android:launchMode 属性为singleInstance,当跳转此页面时,系统会直接创建一个新的栈结构,并且保证此站结构中只会存在此Activity实例,不允许其他Activity进入,当点击回退的时候,又返回到之前的任务栈中。
应用场景:
singleTop 适合接收通知启动的内容显示页面,例如当我们接收到很多条消息推送时,每次打开一条消息总不能每次都创建一次实例吧,设置为singleTop模式,复用栈顶页面。
singleTask 适合作为程序的如后点,例如浏览器的主页面,如果从多少应用中启动浏览器,都会启动主页面一次,其余情况都是走 onNewIntent,并且会清空主页面之前的其他页面。
singleInstance 适合作为需要与程序分离的页面,例如闹铃响铃页面。你想设置一个8点的闹钟,7:58 在闹钟设置页面,设置了一个8点的闹钟,然后你点击home回到桌面,点来了其他应用,到8点的时候闹铃响了,弹出了一个闹铃页面(如AlermAlertActivity 是以SingleInstance模式打开),如果你现在点击返回键,这时返回的是之前点开的应用页面,这是因为AlermAlertActivity所在的Task只有他一个元素,因此退出的时候这个Task就清空了,如果使用SingleTask模式,那么返回打开的应该是闹铃设置页面。
singleInstance 不要用于中间页面,跳转就会存在问题。比如 A---> B(singleInstance)------->C,完全退出后,再次启动,打开的是B