转载请注明出处:https://blog.csdn.net/eternally__/article/details/82496515
在AndroidManifest.xml中通过中设置
standrad
standrad是默认的启动模式,每次启动一个Activity都会创建一个新的实例加入到栈中,并处于栈顶的位置,所以在退出的时候,你启动了几次,就需要按几次back键退出程序。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate()"+this.toString());
}
通过intent启动当前activity
mStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
通过log信息可以看出每次启动this.toString()的值都不一样
I/MainActivity: onCreate()com.demo2.MainActivity@8e696d3
I/MainActivity: onCreate()com.demo2.MainActivity@c5923b1
I/MainActivity: onCreate()com.demo2.MainActivity@3206615
singleTop
如果新启动的activity已经位于栈顶,就不会创建新的实例,并且会回调onNewIntent方法。反之如果新启动的activity不是位于栈顶的,就会重新创建新的实例,并添加到栈顶
//首次启动activity
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@a84877d
//之后多次启动activity都不会再创建新的实例,因为当前activity已经位于栈顶
看下面的log信息,很明显创建了两个MainActivity的实例,因为启动了SecondActivity,MainActivity不再位于栈顶位置,所以在SendActivity中启动MainActivity会重新创建一个新的实例
I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@de85aba
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@be63417
I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@3206615
singleTask
每次启动activity时都会在栈中检查是否存在该activity的实例,如果存在直接使用该实例,并把这个activity之上的其他activity都移出栈,并且会回调onNewIntent方法。如果没有发现该activity的实例,那就创建一个实例
MainActivity 为singleTask模式
I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@5c75d51
I/MainActivity: onStart()
I/MainActivity: onResume()
I/MainActivity: onPause()
//跳转到SecondActivity
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@4d92723
I/SecondActivity: onStart()
I/SecondActivity: onResume()
I/MainActivity: onSaveInstanceState()
I/MainActivity: onStop()
//从SecondActivity启动MainActivity,发现MainActivity并没有重新创建新的实例
I/SecondActivity: onPause()
I/MainActivity: onNewIntent()
I/MainActivity: onRestart()
I/MainActivity: onStart()
I/MainActivity: onResume()
I/SecondActivity: onStop()
I/SecondActivity: onDestroy()
singleInstance
singleInstance会启动一个新的栈来管理activity。设置为singleInstance启动模式的activity,启动后,系统会为其单独创建一个栈,这个activity独自位于这个栈中,之后不会重复创建它的实例
I/MainActivity: onCreate() task id=585
I/SecondActivity: onCreate() task id=586
I/ThirdActivity: onCreate() task id=585
从log信息可以看出,MainActivity和ThirdActivity都在一个栈中,因为SecondActivity设置为singleInstance模式,所以单独在一个栈中。当我们按下back键返回的时候,ThirdActivity直接返回了MainActivity,再按下back键返回到了SecondActivity,再按back键退出程序。原因是MainActivity和ThirdActivity都在一个栈中,ThirdActiity出栈后,MainActivity就位于栈顶显示在界面。然后MainActivity出栈后,这个栈已经空了,于是就显示了另一个栈中的SecondActivity