今天体会最深的一点就是android的生命周期,android
在Android中,进程的生命周期大多数时候是由系统管理的;也因为手机应用的一些 特殊性,因此咱们须要更多的去关注各个Android Component的运行时生命周期模型。(所谓手机应用的特殊性主要是指这样2点:web
1. 手机应用的大多数状况下咱们只能在手机上看到一个程序的一个界面,用户除了经过程序界面上的功能按钮来在不一样的窗体间切换,还能够经过Back键和 Home键来返回上一个窗口,而用户使用Back或者Home的时机是很是不肯定的,任什么时候候用户均可以使用Home或Back来强行切换当前的界面。spa
2. 每每手机上一些特殊的事件发生也会强制的改变当前用户所处的操做状态,例如不管任何状况,在手机来电时,系统都会优先显示电话接听界面。)了解这些 Component的生命周期模型一方面是让咱们对软件在手机中的运行状况作到心中有数,更重要的,对于程序开发来讲,生命周期中的每个关键事件都会有 咱们能够覆写于各类Component对应基类型的事件处理方法,了解各Component的生命周期就是让咱们在开发程序时明白咱们该怎样去编写各类事 件的处理代码。
Activity的生命周期模型在Google提供的官方文档上有比较详细的一个图示 。其一共包含7个咱们须要关心的关键事件,下面对其分别详细说明(文字中的粗体字表示后文中会常常用到的概念在第一次出现时会给出解释,以后后文再也不详细说明):
1. void onCreate(Bundle savedInstanceState)
当Activity被第首次加载时执行。咱们新启动一个程序的时候其主窗体的onCreate事件就会被执行。若是Activity被销毁后 (onDestroy后),再从新加载进Task时,其onCreate事件也会被从新执行。注意这里的参数 savedInstanceState(Bundle类型是一个键值对集合,你们能够当作是.Net中的Dictionary)是一个颇有用的设计,因为 前面已经说到的手机应用的特殊性,一个Activity极可能被强制交换到后台(交换到后台就是指该窗体再也不对用户可见,但实际上又仍是存在于某个 Task中的,好比一个新的Activity压入了当前的Task从而“遮盖”住了当前的 Activity,或者用户按了Home键回到桌面,又或者其余重要事件发生致使新的Activity出如今当前Activity之上,好比来电界面), 而若是此后用户在一段时间内没有从新查看该窗体(Android经过长按Home键能够选择最近运行的6个程序,或者用户直接再次点击程序的运行图标,如 果窗体所在的Task和进程没有被系统销毁,则不用从新加载Process, Task和Task中的Activity,直接从新显示Task顶部的Activity,这就称之为从新查看某个程序的窗体),该窗体连同其所在的 Task和Process则可能已经被系统自动销毁了,此时若是再次查看该窗体,则要从新执行 onCreate事件初始化窗体。而这个时候咱们可能但愿用户继续上次打开该窗体时的操做状态进行操做,而不是一切从头开始。例如用户在编辑短信时忽然来 电,接完电话后用户又去作了一些其余的事情,好比保存来电号码到联系人,而没有当即回到短信编辑界面,致使了短信编辑界面被销毁,当用户从新进入短信程序 时他可能但愿继续上次的编辑。这种状况咱们就能够覆写Activity的void onSaveInstanceState(Bundle outState)事件,经过向outState中写入一些咱们须要在窗体销毁前保存的状态或信息,这样在窗体从新执行onCreate的时候,则会经过 savedInstanceState将以前保存的信息传递进来,此时咱们就能够有选择的利用这些信息来初始化窗体,而不是一切从头开始。
2. void onStart()
onCreate事件以后执行。或者当前窗体被交换到后台后,在用户从新查看窗体前已通过去了一段时间,窗体已经执行了onStop事件,可是窗 体和其所在进程并无被销毁,用户再次从新查看窗体时会执行onRestart事件,以后会跳过onCreate事件,直接执行窗体的onStart事 件。
3. 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被系统结束。设计