Activity生命周期

来源:互联网 发布:网络教育的大专有用吗 编辑:程序博客网 时间:2024/05/16 01:34

一、Activity简介

        一个Activity是一个应用程序组件,提供一个屏幕,用户可以与之交互来完成某项任务,例如拨号、拍照、发送email、看地图。

        每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。

        一个应用程序通常由多个activities组成,他们通常是松耦合关系。 通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候将会显示在屏幕上。每次一个新的activity启动,前一个activity就停止了,由系统在一个叫“backstack”的栈上保存activity。当一个新activity启动时,这个activity被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。 

        一个Activity的用户界面是由一组由View class派生的view对象组成。每个view控制Activity窗口的特定矩形空间,以响应用户交互。Android提供了大量原生的view类,用户可以使用这些类设计和组织布局。


二、Activity生命周期

一个Activity可以基本上存在三种状态:

1、Resumed(恢复):activity位于屏幕的前端,并且拥有用户的焦点(focus)

2、Paused(暂停):另一个Activity在屏幕前,取得焦点,但这个Activity仍然可见,失去了用户的焦点。 这个activity进入Paused状态。这个Activity对象仍在内存中 ,它包含状态和成员信息,但是系统在内存不足的情况下可以销毁这个Activity。

3、Stopped(停止):这个Activity完全不可见,但是这个Activity仍然存在(对象保留在内存中,它保持状态和成员信息,但不和窗口管理器(the window manager)有关联),在内存不足时,系统可以销毁这个Activity。


一个Activity的3个生命周期:

1、完整的生命周期(entire lifetime:从系统回调函数onCreate()方法到onDestroy()的过程称为完整的生命周期。

2、可见的生命周期(visible lifetime):从系统回调函数onStart()方法到onStop()方法的过程。在这个生命周期内,这个activity是可见的,用户可以与之交互。由于activity会在可见与不可见之间多次切换,系统可能会多次调用onStart()方法和onStop()方法。

3、前台生命周期(foreground lifetime):从系统回调函数onResume()方法到onPause()方法。在这个生命周期内,这个actvity在屏幕的前端,并且拥有用户焦点。由于这个状态可能会多次重复,因此这两个方法中代码应当是轻量级的。

三、Activity周期的回调方法的总结

onCreate():Activity第一次被创建时调用,如果是activty被系统销毁后重建,这个方法可以通过传入的Bundle对象恢复之前Activity的状态。

onRestart():当一个Activity已经处于stopped状态,准备重新调用onStart()方法之前调用。

onStart():在activity变得可见之前调用这个方法。

onResume():在Activity获得焦点之前调用。这时候,这个Activity在activity stack的栈顶。

onPause():当系统准备resume另外一个activity时调用这个方法。这个方法通常用来保存一些persistent data(持久的数据)。

onStop():当这个activity不再可见的时候调用这个方法。

onDestroy():在这个activity销毁前调用这个方法。


当activity A启动activity B时产生的调用顺序如下:

1、activity A执行 onPause()方法

2、activity B执行onCreate()方法、onStart()方法和onResume()方法

3、然后,如果ActivityA 已不再是显示在屏幕上,它执行onStop()方法


四、保存activity状态  

       前面提到在一个activity暂停或者停止的时候,activity的状态仍然是保存在内存中的,但是如果系统由于内存不足销毁了这个acitivity对象时,这时候用户如果想回到那个activity对象时,系统就会重建这个activity对象,而此时用户可能更关心的是activity之前的状态。在这种情况下,我们必须通过实现一个额外的回调函数onSaveInstanceState(),通过这个回调函数来保存哪个activity的一些重要信息。

     onSaveInstanceState()这个回调方法在activity变得不稳定前会被调用。系统会给这个方法传递一个Bundle对象,在这个对象里,你可以通过name-alue pairs(名字-值队的方式)方式来保存一些状态信息。例如使用putString() andputInt()方法。随后如果系统销毁这个activity对象,当系统重建这个activity对象时,在onCreate()onRestoreInstanceState()方法中会传递上面提到的Bundle对象。使用这两个方法中任意一个方法来回复之前activity的状态。如果没有状态信息需要恢复,这个Bundle对象将是null。



注意:Activity被销毁之前不保证 onSaveInstanceState() 会调用,因为有些情况下,它不需要保存状态(例如,当用户使用“后退“ 按钮离开Activity的时候,因为用户已明确关闭的Activity)。如果是系统调用onSaveInstanceState() ,那么他会在 onStop()前也可能在onPause()前调用。

        即使我们实现onSaveInstanceState()方法,有些activity的状态会由activity对象的默认onSaveInstanceState()实现自动恢复。尤其是布局上的view对象保存的一些信息会由默认onSaveInstanceState()实现自动保存。当然这里面需要你为view对象提供一个独一无二的id,如果没有ID,系统是不会为其保存状态的。

        因此当我们实现默认onSaveInstanceState()方法时,最好要调用系统的默认实现。同样onRestoreInstanceState()方法也是如此。

        由于onSaveInstanceState()方法并不保证一定会被调用,因此我们在使用它的时候仅仅会记录一些the transient state (瞬时的状态)of the activity (the state ofthe UI),而不应该保存persistent data(持久性数据)。我们应当在onPause()保存persistent data。

        

原创粉丝点击