`
xiejifu
  • 浏览: 3166 次
  • 性别: Icon_minigender_1
  • 来自: 广西
最近访客 更多访客>>
社区版块
存档分类
最新评论

Activity、Service、BroadcastReceiver三大组件生命周期以及它们在生命周期中间的状态、在状态转变时调用执行的方法、以及当这些进程被关

阅读更多

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() 方法。Androidactivity有可能被销毁之前(即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()方法。 


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


按下Ctrl+F12时ActivityLifecycle.rar

分享到:
评论

相关推荐

    实验四-Android基本组件交互实验.doc

    Service组件 Service一般由一个Activity或其他Context对象来启动,当启动Service之后,该Se rvice将会在后台运行,及时启动这个Service的Activity或其他组件的生命周期已经结 束,Service仍然会继续运行,直到自己...

    andriod精华学习教程

    中,Activity具有自己的生命周期(由系统控制生命周期,程序无法改变,但可 以用onSaveInstanceState保存其状态)。 对于Activity,关键是其生命周期的把握(如那张经典的生命周期图=.=),其 次就是状态的保存和恢复...

    Android实验六.doc

    接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将 包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android 会弹出超时dialog。 【思考题】 1. 发送广播消息...

    Android典型技术模块开发详解

    3.2 Activity的生命周期 3.3 基本用法 3.3.1 创建Activity 3.3.2 启动Activity 3.3.3 窗口Activity 3.3.4 Activity生命周期验证 3.4 Activity之间通信 3.4.1 Activity传递一般类型 3.4.2 Activity传递对象类型 3.4.2...

    疯狂Android讲义源码

     10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383  10.2.4 客户端访问AIDLService 385  10.3 电话管理器  ...

    疯狂Android讲义.part2

    10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端访问AIDLService 385 10.3 电话管理器 (TelephonyManager) 393 10.4 ...

    疯狂Android讲义.part1

    10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端访问AIDLService 385 10.3 电话管理器 (TelephonyManager) 393 10.4 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 ...

    Android开发艺术探索

    第1章 Activity的生命周期和启动模式 / 1  1.1 Activity的生命周期全面分析 / 1  1.1.1 典型情况下的生命周期分析 / 2  1.1.2 异常情况下的生命周期分析 / 8  1.2 Activity的启动模式 / 16  1.2.1 Activity的...

    Android 开发技巧

    2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 2.1.4、Activity 的跳转(含Bundle传值) 17 2.1.5.Actvity 堆栈 18 2.1.6、Intent对象调用Activity实例 19 2.1.7、Activity透明 21 2.1.8、一次性关闭...

    Android开发资料合集-World版!

    2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 2.1.4、Activity 的跳转(含Bundle传值) 17 2.1.5.Actvity 堆栈 18 2.1.6、Intent对象调用Activity实例 19 2.1.7、Activity透明 21 2.1.8、一次性关闭...

    OPhone应用开发权威指南(黄晓庆)

    3.2.2 Activity的生命周期 48 3.2.3 启动Activity 55 3.2.4 Activity和Task 58 3.3 Content Provider 61 3.4 BroadcastReceiver 64 3.5 Service 66 3.6 安全与许可 66 3.6.1 安全架构 66 3.6.2 许可 67 3.7 数字签名...

    Android实例代码

    10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:TelephoneManager; 10.4、短信管理器:SmsManager; 10.5、音频管理器:AudioManager; 10.6...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:TelephoneManager; 10.4、短信管理器:SmsManager; 10.5、音频管理器:AudioManager; 10.6...

Global site tag (gtag.js) - Google Analytics