(本文属于基础,但是在了解之前必须知道Activity的生命周期,以及Intent的基本用法)
1.活动的启动模式:
活动的启动模式一共有四种:
standard,singleTop,singleTask,singleInstance
下面进行详细介绍
1.1 standard(活动默认的启动模式)
系统不会在乎这个活动是否已经在返回栈(返回栈的知识在本文结尾)中存在,每次启动都会创建该活动的一个新的实例。
实践证明:
首先,在MainActivity的布局文件中加入一个button,再写上这行代码:
android:onClick="onClick"
其次,在MainActivity中写入如下代码:
@Override
protectedvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("TAG", this.toString());//在活动第一次被创建的时候调用
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
publicvoidonClick(View v) {
Intentintent=newIntent(this,MainActivity.class);
startActivity(intent);
}
这行代码,从逻辑上虽然没有任何意义,但是点击按钮(这里点击一次)就会发现,无论当前活动是否在返回栈中存在,再启动这个活动的时候,总会创建一个新的活动实例。此时返回栈中存在两个FirstActivity实例,因此需要连按三个Back键才能退出程序。
1.2 singleTop
在启动活动时如果返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例
实践证明:
在Manifest.xml中的修改如下代码(如图):
android:launchMode="singleTop"
在上面代码的基础上,不论单击多少次,仅按一次back键就可以退出程序。因为,此时MainActivity已经处于返回栈的栈顶,每次想要再启动一个MainActivity时,都会直接使用栈顶的活动,因此MainActivity只会有一个实例,仅按一次back键就可以退出程序。
不过当MainActivity不在栈顶位置时,再启动MainActivity时,还是会创建实例的。(可以通过再创建一个活动,进行验证)
这是在activity_second.xml文件中作出如下更改:
在SecondActivity.java中添加如下代码:
在MainActivity中修改Intent,使按动按钮可以启动SecondActivity
结论:从MainActivity进入到SecondActivity,再从SecondActivity进入到MainActivity,返回栈中会存在两个MainActivity的实例,此时按一次Back键回到SecondActivity,再按一次Back键回到MainActivity。
1.3 singleTask
目的:让某个活动在整个应用程序的上下文中值存在一个实例
解析:当启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
在源代码的基础上:在MainActivity中写入如下代码:
@Override
protectedvoid onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i("TAG", "onRestart");
}
在SecondActivity.java中添加如下代码:
@Override
protectedvoid onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("TAG", "SecondActivityonDestroy");
}
会发现,在SecondActivity启动MainActivity时,会发现返回栈中已经存在一个MainActivity的实例,并且是在SecondActivity的下面,于是SecondActivity出栈,但是MainActivity重新成为栈顶活动,因此MainActivity会执行onRestart方法,按一下Back键就可以退出程序。
1.4 singleInstance
指定为这个模式的活动会启动一个新的返回栈来管理这个活动,(每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈入栈是必然是创建了新的活动实例,使用singleInstance就可以解决这个问题),咋这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都公用同一个返回栈,也就解决了共享活动实例的问题。
MainActivity中的代码修改为:
在SecondActivity.java中的代码修改为:
在ThridActivity.java中的代码修改为:
运行程序,从MainActivity进入到SecondActivity,再进入到ThridActivity,会发现SecondActivity存在一个单独的栈里。
脑补部分:返回栈
Android是使用任务(Task)来管理活动的,一个任务就是一组放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种先进后出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而当我们销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。