在安卓中各大控件都要依附Activity来完成与用户的交互,Activity(活动)作为控件的平台。界面的实现都要用到Activity,简单的说Activity就是安卓的UI部分。

Activity的生命周期

一个Activity的创建与销毁要经历一下几个方法:

onCreate -> onStart -> onResume :新的Activity第一次创建

onPause -> onStop -> onCreate -> onStart -> onResume :  新的Activity启动

onPause -> onStop -> onDestory : 第二个Activity执行退出 onRestart -> onStart -> onResume : 第一个Activity执行

当一个Activity因为系统内存不足而要被销毁时数据信息可以在onSaveInstanceState()中保存,此方法在onPause之前被调用。(保存View的状态)

onCreate:第一次创建Activity时调用 ,我们一般重写此方法,在里面进行一些数据初始化,设置用户界面的工作。

onStart:当Activity处于可见状态的时候。

onResume:当Activity得到用户焦点,也就是说Activity准备好与用户进行交互时执行。

onRestart:Activity没有被销毁重新调用这个Activity时。

onPause:Activity失去用户焦点也就是当前Activity不能与用户进行交互时或者说当前Activity被遮挡时。

onStop:Activity处于不可见状态时。

onDestroy:Activity被销毁时。

需要注意的是这其中有一种情况就是屏幕旋转的问题,当用户旋转手机屏幕,每一次都会导致activity的销毁和重新建立。

在横竖屏切换时如果不设置Activity的ConfigChanges属性切屏会重新调用各个生命周期,切横屏会执行一次,切竖屏会执行二次。设置Android:ConfigChanges属性为"orientation"时切屏还是会重新调用各个生命周期,切横竖屏时都只会调用一次。设置Android:configChanges属性为orientation/keyboardHidden时切横竖屏不会调用各个生命周期,只会执行onConfigurationChanged方法。

在这种情况下,尽管实际的activity实例已经被销毁,但是系统仍然记得它的存在,当用户返回到它的时候,系统会创建出一个新的实例来代替它,这里需要利用旧实例被销毁时候存下来的数据。这些数据被称为“instance state”,是一个存在Bundle对象中的键值对集合。

缺省状态下,系统会把每一个View对象保存起来(比如EditText对象中的文本,ListView中的滚动条位置等),即如果activity实例被销毁和重建,那么不需要你编码,layout状态会恢复到前次状态。

但是如果你的activity需要恢复更多的信息,比如成员变量信息,则需要自己动手写了。


Activity的四种启动方式

分别为Standard、singleTop、singleTask、singleInstance

1.standard:每次激活Activity都会创建一个Activity并放入任务栈中。

2.singleTop:若在任务栈顶刚好存在该Activity的实例,就重用该实例。若不存在,则重新创建一个Activity放入任务栈中。(即使任务栈中存在该实例,只要不要栈顶都会重新创建一个Actitivy放入任务栈顶)虽然不会创建新的Actitvity但是每次都会调用onNewIntent()方法.

3.singleTask:若在该任务栈中存在该实例,则将该Activity实例之上的实例全部移出栈,让该实例回到栈顶得到重用,若任务栈中没有该实例,则创建一个Activity压入栈顶。

4.singleInstance:独享任务栈模式,类似于浏览器。系统创建一个新的任务栈只存放这一个Actitivy实例,其他Activity或应用共享此实例。


天道酬勤