最近在项目测试的时候,发现自己对android的启动模式几乎不懂,所以专门花了些时间测试下。我讲得尽量简单些。(复杂的我也将不出来,呵呵)
1.standard : 当你不去设置launchMode属性时,默认为standard ,standard 表示只要启动了这个activity就会创建一个新的实例,位于栈顶,而原来的实例则被压栈。
验证方式:
android:launchMode="standard"
class buttonAclickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent i = new Intent(ActivytA.this, ActivytA.class);
startActivity(i);
}
}
总是启动当前activity,点击5次,这时候存在6个该activity的实例,那么你再按返回键,需要返回6次才能退出程序,明白了吧
2.singleTop :当launchMode设置为singleTop时,其实和standard差不多,唯一差别就是每次创建新的实例,会去检测当前栈顶是不是要创建的实例,如果是则直接用栈顶的,不创建,反之创建。
验证方式:
android:launchMode="singleTop"
class buttonAclickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent i = new Intent(ActivytA.this, ActivytA.class);
startActivity(i);
}
}
总是启动当前activity,点击5次,这时候只存在1个activity实例,按返回键,就直接退出程序了。简单吧。
如果在栈顶则依次调用onNewIntent(Intent intent),onRestart() ,onStart() ,onResume()
3.singleTask :当launchMode设置为singleTask 时,表示当前task只存在该activity的一个实例,不会有第二个,一山不容二虎,呵呵。
当重新启动该activity时,依次调用onNewIntent(Intent intent),onRestart() ,onStart() ,onResume()
如果使用这种模式,在传递数据时,注意在onNewIntent方法里处理,这里不做解释,你懂的。
注意:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会将它上面的activity干掉,下面的不会理会。
所以,当一个应用里面有多个activity设置singleTask,程序只认第一个属性为singleTask的activity,其它的无视。
举例:程序x里面有a,b,c三个activity都设置了singleTask,启动a,跳到b,再跳到c,此时三个实例都存在,a在栈底,此时从才跳到a,那么b,c就都被destroy了。
4.singleInstance :当launchMode设置为singleInstance 时,表示重新建立一个task,并且这个task只存在该activity的一个实例,如果你需要调用第三方activity时,比如google地图,当你停留在google地图上,点击home键出去,你再进来事实上这里还是当前activity,一个应用。比如导游应用启动地图Activity,实际上是在导游应用task栈之上singleInstance模式创建的(如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity,地图Activity回退的时候,只是把这个栈移开了,这样就看到导游应用刚才的Activity了;