`
crazier9527
  • 浏览: 1008802 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity 的运行时生命周期模型

阅读更多

由于在Android 中,进程的生命周期大多数时候是由系统管理的;另外也由于手机应用的一些特殊性,所以我们需要更多的去关注各个Android Component的运行时生命周期模型。(所谓手机应用的特殊性主要是指这样2点: 1. 手机应用的大多数情况下我们只能在手机上看到一个程序的一个界面 ,用户除了通过程序界面上的功能按钮来在不同的窗体间切换,还可以通过Back键和Home键来返回上一个窗口,而用户使用Back或者Home的时机是 非常不确定的,任何时候用户都可以使用Home或Back来强行切换当前的界面。 2. 往往手机上一些特殊的事件发生也会强制的改变当前用户所处的操作状态,例如无论任何情况,在手机来电时,系统都会优先显示电话接听界面。)了解这些 Component的生命周期模型一方面是让我们对软件在手机中的运行情况做到心中有数,更重要的,对于程序开发来说,生命周期中的每一个关键事件都会有 我们可以覆写于各种Component对应基类型的事件处理方法,了解各Component的生命周期就是让我们在开发程序时明白我们该怎样去编写各种事 件的处理代码。例如Activity的Create,就会有对应的事件处理函数onCreate,我们可以从Activity基类覆写这个事件处理函数完 成我们需要的相关事件处理:

public class actMain extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
…… //我们的事件处理代码
}
……


这篇Post我们就来看看最常用的Activity的运行时生命周期模型(Service的运行时生命周期模型在下一篇讲述了如何启动一个Service并和其通信后再做描述)。 Activity的生命周期模型在Google提供的官方文档上有比较详细的一个图示:
 
其一共包含7个我们需要关心的关键事件,下面对其分别详细说明(文字中的粗体字表示后文中会经常用到的概念在第一次出现时会给出解释,之后后文不再详细说明):
1. void onCreate(Bundle savedInstanceState)
当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后 (onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。注意这里的参数 savedInstanceState(Bundle类型是一个键值对集合,大家可以看成是.Net中的Dictionary)是一个很有用的设计,由于 前面已经说到的手机应用的特殊性,一个Activity很可能被强制交换到后台(交换到后台就是指该窗体不再对用户可见,但实际上又还是存在于某个 Task中的,比如一个新的Activity压入了当前的Task从而“遮盖”住了当前的Activity,或者用户按了Home键回到桌面,又或者其他 重要事件发生导致新的Activity出现在当前Activity之上,比如来电界面),而如果此后用户在一段时间内没有重新查看该窗体(Android 通 过长按Home键可以选择最近运行的6个程序,或者用户直接再次点击程序的运行图标,如果窗体所在的Task和进程没有被系统销毁,则不用重新加载 Process, Task和Task中的Activity, 直接重新显示Task顶部的Activity, 这就称之为重新查看某个程序的窗体),该窗体连同其所在的Task和Process则可能已经被系统自动销毁了,此时如果再次查看该窗体,则要重新执行 onCreate事件初始化窗体。而这个时候我们可能希望用户继续上次打开该窗体时的操作状态进行操作,而不是一切从头开始。例如用户在编辑短信时突然来 电,接完电话后用户又去做了一些其他的事情,比如保存来电号码到联系人,而没有立即回到短信编辑界面,导致了短信编辑界面被销毁,当用户重新进入短信程序 时他可能希望继续上次的编辑。这种情况我们就可以覆写Activity的void onSaveInstanceState(Bundle outState)事件,通过向outState中写入一些我们需要在窗体销毁前保存的状态或信息,这样在窗体重新执行onCreate的时候,则会通过 savedInstanceState将之前保存的信息传递进来,此时我们就可以有选择的利用这些信息来初始化窗体,而不是一切从头开始。

2. void onStart()
onCreate事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体前已经过去了一段时间,窗体已经执行了onStop 事件,但是窗体和其所在进程并没有被销毁,用户再次重新查看窗体时会执行onRestart事件,之后会跳过onCreate事件,直接执行窗体的onStart事件。

3. void onResume()
onStart事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体时,窗体还没有被销毁,也没有执行过onStop 事件(窗体还继续存在于Task中),则会跳过窗体的onCreate和onStart事件,直接执行onResume事件。

4. void onPause()
窗体被交换到后台时执行。

5. void onStop ()
onPause事件之后执行。如果一段时间内用户还没有重新查看该窗体,则该窗体的onStop 事件将会被执行;或者用户直接按了Back键,将该窗体从当前Task中移除,也会执行该窗体的onStop 事件。

6. void onRestart()
onStop 事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件。

7. void onDestroy()
Activity被销毁的时候执行。在窗体的onStop 事件之后,如果没有再次查看该窗体,Activity则会被销毁。



最后用一个实际的例子来说明Activity的各个生命周期。假设有一个程序由2个Activity A和B组成,A是这个程序的启动界面。当用户启动程序时,Process和默认的Task分别被创建,接着A被压入到当前的Task中,依次执行了 onCreate, onStart, onResume事件被呈现给了用户;此时用户选择A中的某个功能开启界面B,界面B被压入当前Task遮盖住了A,A的onPause事件执行,B的 onCreate, onStart, onResume事件执行,呈现了界面B给用户;用户在界面B操作完成后,使用Back键回到界面A,界面B不再可见,界面B的onPause, onStop , onDestroy执行,A的onResume事件被执行,呈现界面A给用户。此时突然来电,界面A的onPause事件被执行,电话接听界面被呈现给用 户,用户接听完电话后,又按了Home键回到桌面,打开另一个程序“联系人”,添加了联系人信息又做了一些其他的操作,此时界面A不再可见,其onStop 事 件被执行,但并没有被销毁。此后用户重新从菜单中点击了我们的程序,由于A和其所在的进程和Task并没有被销毁,A的onRestart和 onStart事件被执行,接着A的onResume事件被执行,A又被呈现给了用户。用户这次使用完后,按Back键返回到桌面,A的onPause, onStop 被执行,随后A的onDestroy被执行,由于当前Task中已经没有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系统结束。

  • 大小: 64.6 KB
分享到:
评论

相关推荐

    activity 生命周期 demo

    Activity的生命周期主要分为三个阶段:初始化阶段、运行阶段和销毁阶段。这些阶段通过一系列回调方法来表示,开发者可以在这些方法中插入相应的代码以响应状态变化。 1. 初始化阶段: - onCreate():Activity首次...

    应用源码之(Activity生命周期).zip

    Android系统会在内存不足时杀死Activity,因此开发者需要在适当的生命周期方法中保存和恢复状态。例如,`onSaveInstanceState()`用于保存临时状态,`onRestoreInstanceState()`用于恢复。 10. **返回栈(Back ...

    Fragment的生命周期

    Fragment的生命周期与Activity紧密关联,理解Fragment的生命周期对于开发高效、稳定的应用至关重要。 Fragment的生命周期可以分为三个主要阶段:初始阶段、可见性阶段和销毁阶段。 1. **初始阶段** - `onAttach()...

    Android之Activity应用小例子

    开发者需要根据这些生命周期方法来处理相应的逻辑,确保应用程序运行的稳定性和效率。 在创建Activity时,我们需要在AndroidManifest.xml文件中声明。这是Android系统了解应用程序所有组件的地方。例如: ```xml ...

    Android基础系列的Activity

    理解和熟练掌握Activity的生命周期、Intent的使用、Activity间的通信、栈管理、多窗口支持、Activity过渡动画以及配置变化处理,是Android开发者的基本功。通过深入学习和实践,可以创建出更加高效、用户友好的应用...

    Android 60 道面试题及答案.docx

    * Activity 生命周期在启动、打开其他 Activity、关闭、横竖屏切换等情况下会执行不同的生命周期方法 * 在不设置 android:configChanges 属性时,Activity 会销毁并重新创建,而设置了该属性时,只会执行 ...

    042集-跨进程启动Activity和设置Activity多个入口

    同时,良好的编程实践是确保所有入口点都能够正确处理Activity的生命周期,比如在onCreate()、onStart()、onResume()等回调方法中进行必要的初始化和状态恢复。 总的来说,“042集-跨进程启动Activity和设置...

    使用Activity和SSM框架搭建的Maven项目 工作流实现请假实例 附带前端页面 可以直接运行

    Maven是Java项目管理工具,通过定义项目对象模型(POM),Maven可以自动下载依赖、构建项目并管理其生命周期。在这个项目中,会有一个标准的Maven目录结构,包括`src/main/java`(源代码)、`src/main/resources`...

    android activity

    `Activity` 在实现MVC(Model-View-Controller)模型时,主要扮演视图(View)和控制器(Controller)的角色: - **View**:负责展示用户界面。 - **Controller**:处理用户的输入事件,与模型(Model)进行交互。 #### ...

    eclipse activity 工作流插件

    - `activiti-bpmn-converter-5.13-SNAPSHOT.jar`: 负责将BPMN模型文件转换成内部可执行的格式,用于流程的运行时解析。 - `jgraphx-1.10.4.2.jar`: 一个强大的Java图形库,用于绘制流程图,提供丰富的图形和交互...

    初中级Android开发社招面试之Activity篇.zip

    Activity的生命周期是面试中常考的知识点,包括了onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()等方法。每个方法都有其特定的触发场景,例如onCreate()在Activity首次创建时调用,用于初始...

    fragment声明周期详解Demo

    - **onDetach()**: Fragment与Activity断开连接时调用,标志着生命周期的结束。 在实际应用中,开发者可以在这些生命周期方法中插入适当的逻辑,例如在onCreateView()中设置点击监听器,在onResume()中更新数据,...

    Fragment和Activity通信以及Fragment之间通信的方式(二)

    3. **Bundle**:在Fragment的生命周期方法(如`onCreateView()`或`onActivityCreated()`)中,可以通过`getArguments()`获取传入的数据,这些数据在Fragment创建时通过`setArguments(Bundle)`方法放入Bundle中。...

    Activity显示切换多个Fragment

    `Activity`作为应用程序的基本单元,负责处理用户交互和展示UI,而`Fragment`则可以看作是`Activity`的一部分,它有自己的UI和生命周期,可以在多个`Activity`之间复用。本篇文章将深入探讨如何在`Activity`中有效地...

    Android-两种方法管理应用内Activity

    Intent提供了灵活的组件间通信方式,而Activity Stack模型则规定了Activity的生命周期和导航行为。开发者需要根据应用的需求选择合适的启动模式,同时注意优化Intent的使用,避免因不当操作导致内存泄漏或性能问题。...

    Service与Activity通信示例

    Service的生命周期由系统管理,即使在用户离开应用或手机屏幕关闭时,Service仍可以继续运行。 Service与Activity之间的通信主要通过以下几种方式实现: 1. **Binder**: Binder是Android系统中的进程间通信(IPC...

Global site tag (gtag.js) - Google Analytics