在Linux公社发现的一篇好文章,解答了自己的很多疑问,转一下,
一.Activity的生命周期
手机 应用的大多数情况下我们只能在手机上看到一个程序的一个界面,用户除了通过程序界面上的功能按钮来在不同的窗体间切换,还可以通过Back键和Home键来返回上一个窗口,而用户使用Back或者Home的时机是非常不确定的,任何时候用户都可以使用Home或Back来强行切换当前的界面。往往手机上一些特殊的事件发生也会强制的改变当前用户所处的操作状态,例如无论任何情况,在手机来电时,系统都会优先显示电话接听界面。)了解这些Component的生命周期模型一方面是让我们对软件在手机中的运行情况做到心中有数,更重要的,对于程序开发来说,生命周期中的每一个关键事件都会有我们可以覆写于各种 Component对应基类型的事件处理方法,了解各Component的生命周期就是让我们在开发程序时明白我们该怎样去编写各种事件的处理代码。例如 Activity的Create,就会有对应的事件处理函数onCreate,我们可以从Activity基类覆写这个事件处理函数完成我们需要的相关事件处理:
public class actMain extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
当Activity首次被加载执行时,会调用oncreate(Bundle savedInstanceState),该方法在Activity的生命周期中只被调用一次,而其参数则是用户保存的当前活动(Activiy)的窗体的状态的一些变量。其在下面一些情况下会被使用:
用户在当前窗口时,切换到其他窗口而没有finish()该活动,当在一定时间之内回到该界面,如果该界面被系统自动销毁,则可以通过该参数对当时状态进行复原
那么如何保存状态呢,Activity中有个函数名为void onSaveInstanceState(Bundle outState),该函数会在窗体被销毁前自动被调用,该函数只会被系统,且只能在Activity被系统自动回收时才会执行,我们可以在其中做一些保存当前状态的操作。当然State变量并不是一直保存下去,一般来说,当系统发现内存不足时,会主动的回收一些内存空间,这种回收时系统级定义的,所以 state里面并不适合保存重要的和大量的数据。
void onStart()
有两种情况会执行该函数:
1.启动oncreate之后会调用一次onStart()
2.当用户切换到其他活动(Activity),过一段时间之后又切换回来,而该Activity又没有被销毁,并且已经执行了onStop函数,则会跳过onCreate函数直接调用onstart
void onResume()
onStart事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体时,窗体还没有被销毁,也没有执行过onStop事件(窗体还继续存在于Task中),则会跳过窗体的onCreate和onStart事件,直接执行onResume事件。
4. void onPause()
窗体被交换到后台时执行。
5. void onStop()
onPause事件之后执行。如果一段时间内用户还没有重新查看该窗体,则该窗体的onStop事件将会被执行;或者用户直接按了Back键,将该窗体从当前Task中移除,也会执行该窗体的onStop事件。
6. void onRestart()
onStop事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件。
7. void onDestroy()
Activity被销毁的时候执行。在窗体的onStop事件之后,如果没有再次查看该窗体,Activity则会被销毁
最后用一个实际的例子来说明Activity的各个生命周期。假设有一个程序由2个Activity A和B组成,A是这个程序的启动界面。当用户启动程序时,Process和默认的Task分别被创建,接着A被压入到当前的Task中,依次执行了 onCreate, onStart, onResume事件被呈现给了用户;此时用户选择A中的某个功能开启界面B,界面B被压入当前Task遮盖住了A,A的onPause事件执行,B的 onCreate, onStart, onResume事件执行,呈现了界面B给用户;用户在界面B操作完成后,使用Back键回到界面A,界面B不再可见,界面B的onPause, onStop, onDestroy执行,A的onResume事件被执行,呈现界面A给用户。此时突然来电,界面A的onPause事件被执行,电话接听界面被呈现给用户,用户接听完电话后,又按了Home键回到桌面,打开另一个程序“联系人”,添加了联系人信息又做了一些其他的操作,此时界面A不再可见,其 onStop事件被执行,但并没有被销毁。此后用户重新从菜单中点击了我们的程序,由于A和其所在的进程和Task并没有被销毁,A的onRestart 和onStart事件被执行,接着A的onResume事件被执行,A又被呈现给了用户。用户这次使用完后,按Back键返回到桌面,A的 onPause, onStop被执行,随后A的onDestroy被执行,由于当前Task中已经没有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系统结束。