一.活动的生命周期
为了在活动生命周期的各个阶段之间导航转换,Activity类提供了六个回调的核心方法:onCreate(),onStart(),onResume(),onPause(),onStop()和onDestroy()。当活动进入新状态时,系统会调用每个回调。
完整的生命周期是从 onCreate()到onDestroy() , 可见的生命周期是从 onStart()到onStop() ,前台的生命周期是从
onResume()到onPause()。
一般情况下,一个活动会在onCreate()中完成各种初始化操作,在onDestroy()中完成释放内存的操作。
可以在onStart()方法中对资源进行加载,在onStop()方法中对资源进行释放。
在前台生命周期时,用户与活动是处于交互的状态。
在Android中,活动是通过任务(Task)来管理的,一个任务就是一组存放在栈中的活动的集合,这个栈叫返回栈(Back Stack)。
每个活动在其生命周期中最多有4种状态。
1.运行状态,此时活动处于栈顶。
2.暂停状态,活动不处于栈顶,但是还是可见的。比如说对话框。
3.停止状态,此时活动完全不可见,系统仍会为其保留相应状态,但不完全可靠。
4.销毁状态,活动从栈中被移除。
如果活动被回收了怎么办?
当活动进入停止状态时,可能被系统回收。比如在A活动中启动B活动,但是A被系统回收了,此时在B活动中按Back键,仍然会显示活动A,只不过活动A是通过onCreate()重新创建的。如果活动A中存在临时数据,那么这些临时数据就没了。Activity中提供了一个回调方法是 onSaveInstanceState(Bundle outState) ,它可以保证活动被回收之前一定调用该回调方法,所以可以在这个回调方法中存储临时的数据。onSaveInstanceState(Bundle outState) ,该方法中的参数是Bundle类型,它可以用putXxx(key,value)来保存数据。如下代码即保存了临时数据:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "value");
}
数据保存后,我们还要将其取出。
在onCreate()方法中,存在一个Bundle类型的参数。如果活动被系统回收前通过了onSaveInstanceState()方法保存数据的话,这个参数就会带有之前保存的临时数据。代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
Xxx data = savedInstanceState.getXxx("key");
}
}
二.活动的启动模式
活动的启动模式一共有4种,分别为standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
standard是活动默认的启动模式。对于使用standard模式的活动,每次启动都会创建该活动的一个新的实例。
singleTop模式:当启动模式为singleTop时,如果发现Back Stack的栈顶已经是该活动,则直接使用该活动,不再创建新的活动实例。如果该活动不在栈顶,则会重新创建一个新的实例。
singleTask模式:当启动模式为singleTask时,每次启动该活动时系统首先检查在Back Stack中是否存在该活动的实例,如果存在则直接使用该实例,并将其上的活动都出栈,不存在就创建一个新的活动实例。
singleInstance模式:这种模式最特殊和复杂,指定为当前模式的活动会启用一个新的Back Stack来管理这个活动。在这种模式下会有一个单独的Back Stack来管理这个活动,这就允许其他程序的调用,实现了共享活动实例的问题。