Android---Activity生命周期状态

转载 2012年03月28日 23:21:26

Android---Activity生命周期状态

Activity生命周期:

    一个activity主要有三个状态:

               · 当在屏幕前台时(位于当前任务堆栈的顶部),它是活跃或运行的状态。它就是相应用户操作的activity。 

               · 当它失去焦点但仍然对用户可见时,它处于暂停状态。即是:在它之上有另外一个activity。这个activity也许是透明的,或者未能完全遮蔽全屏,所以被暂停的activity仍对用户可见。暂停的activity仍然是存活状态(它保留着所有的状态和成员信息并连接至窗口管理器),但当系统处于极低内存的情况下,仍然可以杀死这 个activity

              · 如果它完全被另一个activity覆盖是,它处于停止状态。它仍然保留所有的状态和成员信息。然而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个activity

               如果一个activity处于暂停或停止状态,系统可以通过要求它结束(调用它的 finish() 方法)或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。

 

当一个activity从这个状态转变到另一个状态时,它被以下列protected方法所通知:

           void onCreate(Bundle savedInstanceState) 

           void onStart() 
           void onRestart() 
           void onResume() 
           void onPause() 
           void onStop() 
           void onDestroy()

         你可以重载所有这些方法以在状态改变时进行合适的工作。所有的activity都必须实现 onCreate() 用以当对象第一次实例化时进行初始化设置。很多情况下我在activity会中实现 onPause()以提交数据变化或准备停止与用户的交互。

调用父类

所有activity生命周期方法的实现都必须先调用其父类的版本。比如说:

protected void onPause() {
    super.onPause();
    . . .
}     

总得来说,这七个方法定义了一个activity完整的生命周期。实现这些方法可以帮助你监察三个嵌套的生命周期循环:

· 一个activity 完整的生命周期自第一次调用 onCreate()开始,直至调用onDestroy()为止。activityonCreate()中设置所有全局状态以完成初始化,而在onDestroy()中释放所有系统资源。比如说,如果activity有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。 

· 一个activity可视生命周期自 onStart() 调用开始直到相应的 onStop()调用。在此期间,用户可以在屏幕上看到此activity尽管它也许并不是位于前台或者正在与用户做交互。在这两个方法中,你可以管控用来向用户显示这个activity的资源。比如说,你可以在onStart() 中注册一个BroadcastReceiver 来监控会影响到你UI的改变,而在onStop() 中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

· 一个activity的 前台生命周期自 onResume() 调用起,至相应的 onPause()调用为止。在此期间,activity位于前台最上面并与用户进行交互activity会经常在暂停和恢复之间进行状态转换──比如说当设备转入休眠状态或有新的activity启动时,将调用onPause() 方法。当activity获得结果或者接收到新的intent的时候会调用onResume() 方法。因此,在这两个方法中的代码应当是轻量级的。

 

下图展示了上述循环过程以及activity在这个过程之中历经的状态改变。着色的椭圆是activity可以经历的主要状态。矩形框代表了当activity在状态间发生改变的时候,你进行操作所要实现的回调方法。

 

下表详细描述了这些方法,并在activity的整个生命周期中定位了它们。

方法

描述

可被杀死

下一个

onCreate()

activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、绑定数据至列表等。如果曾经有状态记录(参阅后述Saving Activity State。),则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。 

总继之以onStart()。

onStart()

 

onRestart()

activity停止后,在再次启动之前被调用。 

总继之以onStart()。

onStart()

onStart()

activity正要变得为用户所见时被调用。 

activity转向前台时继以onResume(),在activity变为隐藏时继以onStop()。

onResume() 
or
onStop()

 

onResume()

activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。 

继之以onPause()。

onPause()

onPause()

当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成,因为下一个activity必须等到此方法返回后才会继续。 

activity重新回到前台是继以onResume()。当activity变为用户不可见时继以onStop()。

onResume() 
or
onStop()

onStop()

activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity(可能是现存的或者是新的)回到运行状态并覆盖了它。 

如果activity再次回到前台跟用户交互则继以onRestart(),如果关闭activity则继以onDestroy()。

onRestart() 
or
onDestroy()

onDestroy()

activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束(调用了它的 finish() 方法)或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用isFinishing() 方法来区分这两种情况。

nothing

请注意上表中可被杀死一列。它标示了在方法返回后,还没执行activity的其余代码的任意时间里,系统是否可以杀死包含此activity的进程。三个方法(onPause()、 onStop()onDestroy())被标记为onPause()是三个中的第一个,它也是唯一一个在进程被杀死之前必然会调用的方法──onStop() 和 onDestroy() 有可能不被执行。因此你应该用 onPause() 来将所有持久性数据(比如用户的编辑结果)写入存储之中。

在可被杀死一列中标记为的方法在它们被调用时将保护activity所在的进程不会被杀死。所以只有在onPause()方法返回后到onResume() 方法被调用时,一个activity才处于可被杀死的状态。在onPause()再次被调用并返回之前,它不会被系统杀死。

如后面一节进程和生命周期所述,即使是在这里技术上没有被定义为可杀死activity仍然有可能被系统杀死──但这仅会发生在实在没有其它方法的极端情况之下。

保存activity状态

当系统而不是用户自己出于回收内存的考虑,关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。

为了获取activity被杀死前的状态,你应该为activity实现onSaveInstanceState() 方法。Android会调用此方法activity有可能被销毁之前(即onPause() 调用之前)。它会将一个以名称-值对方式记录了activity动态状态的Bundle 对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(),所以它们两个都可以恢复捕获的状态。

与onPause()或先前讨论的其它方法不同,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说,Android会在activity易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK键)造成的销毁则不调用。在这种情况下,用户没打算再次回到这个activity,所以没有保存状态的必要。

因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据。而是应该用onPause()来达到这个目的。

协调activity

当一个activity启动了另外一个的时候,它们都会经历生命周期变化。一个会暂停乃至停止,而另一个则启动。这种情况下,你可能需要协调好这些activity

生命周期回调顺序是已经定义好的,尤其是在两个activity在同一个进程内的情况下:

1. 调用当前activity的 onPause() 方法。 

2. 接着,顺序调用新启动activityonCreate()、 onStart()和onResume()方法。 

3. 然后,如果启动的activity不再于屏幕上可见,则调用它的onStop()方法。 


总之:1、Activity 从创建到进入运行态所触发的事件  onCreate()-->onStart-->onResume()

          2、从运行态到停止态所触发的事件                 onPause()--->onStop()

          3、从停止态到运行态所触发事件                    onRestart()-->onStart()--->onResume()

     4、从运行态到暂停态所触发事件                   onPause()

          5、从暂停态到运行态所触发事件                    onResume()


还有就是当切换横竖屏幕时也会发生生命周期事件:

Android---Activity生命周期状态

Activity生命周期:     一个activity主要有三个状态:                · 当在屏幕前台时(位于当前任务堆栈的顶部),它是活跃或运行的状态。它就是相应用...
  • jxiang112
  • jxiang112
  • 2014年02月26日 19:49
  • 341

Android---Activity生命周期状态

未来必然是智能机的天下
  • aaaaatiger
  • aaaaatiger
  • 2011年03月04日 11:43
  • 472

Android---activity的生命周期

Android—activity的生命周期一、单个activity的生命周期1.首先新建一个Android项目,然后重写生命周期的相关函数 protected void onStart(){ ...
  • Desire_for_success
  • Desire_for_success
  • 2016年05月12日 13:11
  • 90

Android---Activity 生命周期(四)Recreating Activity

1》There are a few scenarios in which your activity is destroyed due to normal app behavior, such as ...
  • cxc19890214
  • cxc19890214
  • 2015年06月12日 15:00
  • 419

MediaPlayer的生命周期以及状态转换

MediaPlayer类可用于控制播放音频/视频文件和流。关于如何使用这个类的方法的例子可以在VideoView找到。...
  • songshizhuyuan
  • songshizhuyuan
  • 2014年06月21日 19:32
  • 3331

线程Thread的生命周期以及状态

由于早上没有网,所以几篇写好的博客就一起发啦。       上2篇博客中记录了,线程和进程的异同,操作线程的常用方法的区别,其实,一个线程的生命周期在整个进程中是非常的重要的,它不仅仅关系到...
  • Watering_sea
  • Watering_sea
  • 2015年06月27日 22:44
  • 1434

Activity的生命周期以及几种状态

1. 启动Activity:系统会先调用onCreate()方法,然后调用onStart()方法,最后调用onResume()方法,Activity进入运行状态。 2. 当前Activity被其他A...
  • hutubeyond
  • hutubeyond
  • 2016年09月17日 22:55
  • 1077

软件测试Bug和bug生命周期中的各种状态

所有软件开发过程的目的都是为客户(软件产品的终端用户)提供一个解决问题的方案(软件产品),以帮助客户更加高效地工作或生活(从时间和费用上来讲)。一个成功的软件开发过程就是为客户提供了所有他所要求的需求...
  • qq_34651940
  • qq_34651940
  • 2016年07月03日 22:50
  • 3219

进程生命周期与状态转换

http://www.cnblogs.com/qianye/archive/2012/11/25/2788330.html 进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变...
  • OnafioO
  • OnafioO
  • 2016年03月28日 14:09
  • 2116

并发编程(4)线程的生命周期及基本状态

线程从创建到最终的消亡,要经历若干个状态,一般来说,线程包括以下这几个状态:新建(new),可运行(runnable),运行(running),阻塞(blocked),死亡(dead)。 先来一张经典...
  • u012170724
  • u012170724
  • 2016年03月24日 16:04
  • 462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android---Activity生命周期状态
举报原因:
原因补充:

(最多只允许输入30个字)