Android的Activity有四种启动模式,分别是:
standard
singleTop
singleTask
singleInstance
启动模式需要在AndroidManifest.xml对Activity进行设置
如:
<activity
android:name="Activity Name"
android:launchMode="standard" />
不同的启动模式有不同的作用,这点很重要,一般初学者会忽视启动模式。
standard:
默认情况下,Activity的启动模式为standard,该模式为:不管task中有什么Activity,都会启动一个新的Activity。所以该模式下有可能你的task中有重复的Activity。
singleTop:
该模式下,task的顶部、栈顶如果是需要启动Activity,则会启动这个旧的已存在的Activity,如果不是则像standard模式一样创建一个新的Activity。
一般情况下,我们都使用这种模式,这种模式可以避免我们重复创建当前Activity。
另外,如果通过startActivity,则会调用该Activity的onNewIntent(Intent intent)方法。
什么时候需要使用该模式?
举个例子:用户使用App,界面停留在Activity A,用户按Home键退到后台,这时我们的App发送了一个通知栏信息,我们需要用户点击通知栏信息跳转到我们原来的那个Activity A,那么如果Activity A是standard模式,那么如果start Activity A,则会创建一个新的Activity A,那么task中就会有两个Activity,用户按下back,还是Activity A,这么肯定不行的,这时候就使用singleTop模式了,通过onNewIntent方法获得Intent对象来更新界面等操作。
singleTask:
该模式下,task中只会存在唯一的Activity,如果需要启动的Activity已经存在task中,则会destory在它之上的所有Activity,并调用它的onNewIntent方法,如果不存在,则像standard模式一样创建一个新的Activity。
该模式很像singleTop对不对?但却存在明显的区别,singleTop不会销毁它上面的Activity,如果不是顶部则会重新创建。
需要注意的是:该模式下,如果启动Activity使用的是startActivityForResult方法,那么启动它的Activity的onActivityResult方法并不会在被启动的Activity的finish后被调用。很绕口对不对?
通俗点讲:有一个Activity A,它通过startActvityForResult方法启动了Activity B,按我们以前的想法,在Activity A中的onActivityResult方法会在Activity B 结束之后被调用,但遗憾的是如果Activity B是singleTask,那么并不会发生这样的调用,而是在启动Activity B的时候就调用了onActivityResult。
那么什么时候需要改模式?
举个例子:比如我们有个登陆界面,登陆界面有个QQ第三方登陆,用户点击这个第三方登陆跳转到QQ的授权页,我们需要QQ授权后回到我们的登陆界面上进行自己服务器的登陆操作,当然你可以想到很多种方式来处理这个逻辑,比如在登陆界面的onResume()方法中进行判断处理等。但如果用到模式方式,我们只需要更改登陆界面为singleTask,然后在QQ第三方登陆的回调中startActivity启动登陆界面即可,这样会启动登陆界面的onNewIntent方法,并且将它上面的其他Activity全部移除。
singleInstance
改模式下,task中只会存在唯一一个Activity,并且Activity所处的task与其他task分开。