Activity生命周期相关

来源:互联网 发布:淘宝限时秒杀是真的吗 编辑:程序博客网 时间:2024/05/22 00:16
Activity的子类中两个重要的方法

     onCreate(Bundle): 初始化你的activity,使用setContentView(int) 来给activity设置UI,使用findViewById(int)来获取UI中的widgets。
     onPause(): 当用户离开这个acitivty时,用户的所有改变(change)在这里应该被保存。


Activity的生命周期(Lifecycle)

     要注意的是,以下说得kill/杀死,指的都是系统杀死activity所在的进程(process),系统不会杀死单一activity

     系统使用activity栈(activity stack)来管理activity,当一个新的activity启动时(started),它被放置在栈顶,之前的activity置于它的下面,直到新的activity退出,之前的activity才会回到前台。
     总地来说Activity有四种状态:
     ①、在屏幕前台(即是在栈顶),为resumed状态,不可杀死。
     ②、可见但是失去焦点(即不可与用户进行交互,比如上面有另外一个非全屏的或者透明的activity),此时activity处于paused状态,但它还是活的(alive),维持着activity上的成员信息(it maintains all state and member information and remains attached to the window manager),还附着于window manager。在系统极度缺少内存的情况下会被杀死。
     ③、完全被其他activity遮挡,用户不可见。此时是stopped状态。但它还维持着成员信息( It still retains all state and member information)。当系统其它地方需要内存时,它会被杀死。
     ④、当activity是paused或者stopped状态时,系统可以通过要求其finish或直接杀死其所在的进程的方法,来结束一个activity,当这个activity再次回到前台时,必须完全重启与恢复到它之前的状态。
     
     在onCreate()中进行初始化工作或全局状态(global state)的准备。在onDestroy()中进行资源的释放。比如需要有个后台下载的线程,则可以在onCreate()方法中进行创建,然后在onDestroy()中进行停止。
     在onPause()方法中提交需要持久化的数据、停止动画以及其它需要使用CPU的事情,需要注意的是在onPause()中的实现应该越快越好,因为onPause()方法不返回,后面(stop/destroy/resume)就无法继续。要注意的是,手动调用finish()方法,也会依照顺序执行onPause()、onDestroy()。
     在onStop()方法中进行heavey-load的操作,例如保存应用数据、用户数据、存储数据库、执行网络操作等耗时或耗CPU资源的。当一个activity进入stopped状态后,这个activity对象会被驻留在内存中,它还维持着其中的所有状态和成员信息(member information),比如edittext中用户输入的内容等,即是系统杀死了activity所在的进程,activity中的所有状态和信息都还保存在bundle中,并且将在用户回到这个activity时恢复,如果要保存view的状态,需要给它一个ID
     onDestroy()方法在一个activity被finished时回调,可能是有人调用finish()方法,也可能是系统为了节省空间暂时地把这个activity的实例给destroy掉。可以通过isFinishing()方法来区别这两者。tips:在onPause()方法中使用isFinishing()方法,来判断activity只是单纯地暂停还是正在结束。
     


异常情况下的生命周期
   onSaveInstanceState(Bundle)
     onSaveInstanceState(Bundle)调用时机:
          ①、 资源相关的配置信息发生改变导致Activity生命周期异常,比如旋转屏幕。activity会被销毁重建,这个方法会被调用。
            ②、 用户按下home键。
            ③、 系统回收内存,杀死activity所在的进程前。
     这个方法在onStop()方法调用之前被调用,用户按返回键或主动调用finish()方法将不会调用这个方法。
     可以在这个方法里面进行activity的一些动态数据的保存(保存在bundle中)。在之后如果activity被re-created的话,可以在onCreate()方法中取回bundle。需要注意的是,应该在onPause()方法中保存需要持久化的数据,而不应在onSaveInstanceState()方法中,因为后者不是生命周期方法中的一部分,它并不会在任何情况下都被调用。可以看onSaveInstanceSate(Bundle)的官方文档:"This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state." 在一个activity可能被杀死时,才会调用这个方法。希望系统自动保存view的状态的话,需要给view一个id。

     onRestoreInstanceState()
     只有在系统杀死activity所在进程且用户又回到这个activity时才会调用这个方法:
          ①、屏幕方向旋转。
          ②、系统回收内存。
     这个方法在onStart()和onPostCreate()方法之间被调用。
     要注意的是,onRestoreInstanceState()和onCreate()方法接收的Bundle是同一个。onCreate()方法是每次创建activity都会被调用,所以如果需要使用bundle恢复数据的话,需要判断bundle是否为null。为了简便,可以不在onCreate()中恢复数据而在onRestoreInstanceState()中恢复,因为onRestoreInstanceState()只会在bundle不为null时调用(即非第一次创建)。
 


0 0
原创粉丝点击