1.返回栈
首先,Android是用任务(Task)来管理活动的。一个任务就是一组存放在栈里的活动的集合,这个栈就是返回栈(Back Stack)。栈是一种后进先出的数据结构。
简单来说,启动一个活动,它就会在返回栈入栈,并处于栈顶。而当我们调用点击Back按键或调用finish()方法销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶。系统默认显示处于栈顶的活动给用户使用。
图1 返回栈结构
图2 返回栈管理活动出入栈
2.活动状态
每个活动会有4中状态:
2.1 运行状态
活动位于返回栈的栈顶,系统最不愿意回收的活动状态。
2.2 暂停状态
活动不再处于栈顶,但仍然可见,如对话框式的活动。只有内存极低时,系统才会考虑去回收这种状态的活动。
2.3 停止状态
活动不再处于栈顶,且完全不可见。系统仍然为活动保持相应的状态和成员变量。当其他程序需要内存时,有可能会被系统回收。
2.4 销毁状态
活动从返回栈中移除后。系统最倾向于回收这种状态的活动。
3.活动的生存期
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
3.1 onCreate()
活动第一次被创建时调用,完成活动的初始化操作。
3.2 onStart()
对资源进行加载。
活动准备好和用户进行交互时调用。此时活动处于返回栈的栈顶,处于运行状态。
如 打开动画,初始化只有activity获取了焦点后才需要使用的组件)。
3.4 onPause()
准备去启动或者恢复另一个活动时调用。
释放消耗CPU的资源,保存一些关键数据,但执行速度要快。
如:结束占用CPU的动画或者其他正在运行任务(如音乐播放器、视频播放器等各种播放器)。
自动化保存 -- 提交一些未保存的持久性数据,但是只有在用户离开的时候希望这些改变被保存的时候(如写一封Email)。
释放系统资源,就像广播接收者,对传感器的操纵(就像GPS),或者在acitivity被pause之后和用户不需要的时候,任何可能影响你电池寿命的资源。
3.5 onStop()
对资源进行释放。
注:若新启动的活动是 对话框式的活动,onPause()方法会得到执行,而onStop()方法不会执行。
onPause()是失去焦点, onStop()是不可见。
3.6 onDestroy()
活动被销毁之前调用。之后状态变为销毁状态。
此时是完全释放资源,不再重用,而onStop()释放的资源可能再次被重用。
3.7 onRestart()
活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
3.8 3种生存期
以上七个方法中除了onRestart()方法,其他都是两两相对的,从而可将活动分为3种生存期。
3.8.1 完整生存期:onCreate()和onDestroy()方法之间经历的。
3.8.2 可见生存期:onStart()和onStop()方法之间经历的。对用户总是可见的,即便有可能无法和用户进行交互。
3.8.3 前台生存期:onResume()和onPause()方法之间经历的。活动处于运行状态,且可以和用户进行交互。
活动生命周期示意图如下
4.活动防回收
Activity类中提供了onSaveInstanceState()回调方法,在活动被回收前调用,可通过它解决活动被回收时临时数据得不到保存的问题。
onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,如putString()方法保存字符串,putInt()方法保存整型数据,以此类推。每个保存方法需要存入两个参数,第一个参数是键,第二个参数是值即要保存的内容。
例子代码如下
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
String tempDate = "Something to save";
outState.putString("data_key", tempDate);
}
数据保存下来后,在onCreate()方法中恢复数据,关键在于方法的参数Bundle。例子代码如下
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
String tempDate = savedInstanceState.getString("date_key");
}
}