1.standard
在《第一行代码》中看到,学习顺便记录下。
不管系统栈中是否存在这个Activity的实例,都会创建一个新的实例。
下面为点击事件:
Log.d("FirstActivity",this.toString);
Intent intent = new Intent();
intent.setClass(FirstActivity.this,FirstActivity.class);
startActivity(intent);
从自己跳转到自己,然后在按back按钮返回,可以看到Log打印日志如图:
从图中可以看到每次打印的都不一样,说明创建了三个实例,这要按三次Back键才能退出程序。
2.SingleTop
如果指定启动模式为SingleTop,启动Activity时系统发现该Activity的实例存在并存在于栈顶时,则不会再创建一
个新的实例,会复用已经存在的实例。
利用上面的跳转方式可以发现Log的打印日志不一样了:
通过对比可以发现,跳转再返回后都是复用了之前的Activity实例。此时按一次back键就可以退出程序。
上面的实例是位于栈顶,当实例不在栈顶时,会是什么样呢?
Log.d("FirstActivity",this.toString);
Intent intent = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
startActivity(intent);
当从FirstActivity跳转到SecondActivity时,FirstActivity的实例已经不在栈顶。
此时再从SecondActivity跳转到FirstActivity
Log.d("SecondActivity",this.toString);
Intent intent = new Intent();
intent.setClass(SecondActivity.this,FirstActivity.class);
startActivity(intent);
此时再来看看Log打印日志:
可以看到FirstActivity的实例不相同,因此可以推断SingleTop启动模式,当FirstActivity实例不存在于栈顶
(因为由SecondActivity跳转到FirstActivity时,栈顶实例为SecondActivity的。),再跳转到FirstActivity时,
系统会创建一个新的实例放在栈顶。
3.SingleTask
当Activity的启动模式指定为singleTask时,每次启动Activity系统会首先在返回栈中检查是否存在该活动的实例,
如果发现已经存在则直接复用之前的实例,并把在这个Activity上面的Activity全部出栈,否则创建一个新的实例。
在FirstActivity和SecondActivity的onCreate()方法中分别打印出Log信息
Log.d("FirstActivity",this.toString);
Log.d("SecondActivity",this.toString);
首先在FirstActivity的onRestart()方法添加,然后打印Log日志:
@override
protect void onRestart(){
super.onRestart();
Log.d("FirstActivity","onRestart");
}
@override
protect void onDestroy(){
super.onDestroy();
Log.d("SecondActivity","onDestroy");
}
运行程序后,在FirstActivity点击按钮跳转到SecondActivity,然后在SecondActivity点击按钮跳转到FirstActivity。
打印日志为:
从打印日志中可以看出,当启动FirstActivity时,创建了一个实例,然后跳转到SecondActivity时,SecondActivity也创建了一个新的实例,当从SecondActivity跳转回FirstActivity时,FirstActivity并没有创建一个新的实例,而是复用了之前的实例,因此触发了FirstActivity的onRestart()方法,而此时SecondActivity触发了onDestroy()方法,说明SecondActivity的实例已被销毁,正印证了上面那句话
“ 把在这个Activity上面的Activity全部出栈 ”。
此时只有FirstActivity一个实例,按一次back键就能退出程序。
4.SingleInstance
singleInstance是四种模式中最特殊也最复杂的一种。
现将SecondActivity的启动模式设置为singleInstance,然后修改FirstActivity的onCreate():
Log.d("FirstActivity","Task Id is "+getTaskId());
Intent intent = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
startActivity(intent);
然后修改SecondActivity的onCreate()方法:
Log.d("SecondActivity","Task Id is "+getTaskId());
Intent intent = new Intent();
intent.setClass(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
最后修改ThirdActivity的onCreate()方法:
Log.d("ThirdActivity","Task Id is "+getTaskId());
三个activity中都打印了任务栈的ID,运行程序后,打印Log日志如图:
由打印日志中可以看出,FirstActivity和ThirdActivity位于同一个栈中,SecondActivity位于一个独立栈,
此时是ThirdActivity的实例位于栈顶,按一次back键时会发现,出现的Activity是FirstActivity而不是SecondActivity。
因为FirstActivity和ThirdActivity位于同一个栈内,当栈顶实例ThirdActivity从栈顶出栈时,FirstActivity就位于栈顶,
所以界面上出现的就是FirstActivity。而再次点击back键时就会退出程序。