Activity一共有以下四种launchMode:
- standard
- singleTop
- singleTask
- singleInstance
如何配置Activity的启动模式?
直接在AndroidManifest.xml配置的Android:launchMode属性为以上四种之一即可。总结如下:
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
每次跳转系统都会在task中生成一个新的MainActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的MainActivity实例。
这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
跳转时系统会先在栈结构中寻找是否有一个MainActivity实例正位于栈顶,如果有则不再生成新的,而是直接使用,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
应用场景:
singleTop适合接收通知启动的内容显示页面。如某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很不好的体验。singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A —> B (singleInstance) —> C,完全退出后,在此启动,首先打开的是B。