《Android程序设计》一3.7 组件生命周期

3.7 组件生命周期

我们在前面提到过组件的生命周期。例如,onCreate操作会启动一个应用。组件生命周期有两个用途:它有助于每个应用的内存或堆空间被有效利用,并且能够确保保存和恢复整个进程的状态,从而使得Android系统能够运行比实际内存容量更多的应用。
活动生命周期
最复杂的组件生命周期是活动的生命周期。这里我们将通过图表描述它,看看这些状态变化在代码层面是如何处理的。在图3-5中,可以看到活动生命周期的状态和状态转换。处理生命周期状态转换的核心因素在于选择需要实现的那一种生命周期回调,并了解什么时候执行这些回调。
在第11章中,我们将进一步深入探讨这个话题。现在,我们来看看Activity类的两种方法。在运行时调用第一种方法通知应用保存其状态,调用第二种方法支持新的Activity实例恢复已经销毁的Activity生命周期的状态。下面这段代码摘自第11章,在第11章可以看到整个程序,包括所指向的成员变量:

当运行时系统要销毁某个活动但是希望能够在后期重新恢复其状态时,会调用activity的onSaveInstanceState方法。这一点和执行状态转换的其他生命周期方法有显著区别。举个例子,如果一个活动显式地结束了,其状态就不再需要恢复,即使需要传递当前的paused状态,调用其onPause方法。正如之前的代码片段所示,在onSaveInstanceState方法中要做的是保存用户在后期会用到的状态,做到该活动的状态销毁和恢复对于后期使用是透明的:
···
@Override

protected void onRestoreInstanceState(Bundle savedState) {
    super.onRestoreInstanceState(savedState);
    // Restore state; we know savedState is not null
    String answer = savedState.getString("answer");
    // ...
    Log.i(TAG, "onRestoreInstanceState"
          + (null == savedState ? "" : RESTORE) + " " + answer);
}

···
当重新创建已经销毁的活动时,会调用onRestoreInstanceState方法。因此,会运行该应用活动的一个新的实例。该应用活动的前一个实例中通过onSaveInstanceState方法所存储的数据,会通过onRestoreInstanceState方法传递给新的实例。
你可能会认为活动有如此复杂的生命周期,并且堆使用需求限制很严格,Android的活动生命周期在Android应用代码中应该很清晰,需要花费很多时间和精力来满足活动生命周期需求。然而,实际上并非如此。
在很多Android代码中,尤其在小的Android实例中,很少实现生命周期回调功能。这是由于Activity父类会处理生命周期回调,即类View及其子类,并且保存它们的状态,如图3-6所示。这意味着在很多情况下,Android的View类会提供所有必要的用户接口功能, Android应用不需要显式处理大多数的生命周期回调。

这看起来确实很不错,因为它使得Android编程变得简单多了。你不需要编写任何代码,就可以轻松实现如图3-6所示的内容。然而,它也存在不足,因为它会导致编程人员忽略活动的生命周期,直到某天发现自己的代码存在一堆bug变得一团糟。这也是在这里强调生命周期的原因,这也是在第11章要说明如何处理所有的生命周期回调并记录日志的原因。要充分意识到活动生命周期可能是在预防那些难以诊断的bug中所能够做到的最重要的事情。

时间: 2024-09-20 10:25:18

《Android程序设计》一3.7 组件生命周期的相关文章

Android开发之旅:组件生命周期(二)

引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束 实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播 接收者的生命周期--包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 上篇Android开发之旅:组件生命周期(一)讲解了论活动的生命周期及他们可能的状态.通知状态改变的方法.本篇将介绍服务和广播接收者的生命周

Android开发之旅:组件生命周期(一)

引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束 实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播 接收者的生命周期--包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 本文主要讨论活动的生命周期及他们可能的状态.通知状态改变的方法.分为以下三部分: 1.活动生命周期 2.保存活动状态 3.协调活动 1.活动

Android开发之旅:组件生命周期(三)

Android系统试图尽可能长地保持一个应用程序进程,但是当内存低时它最终还是需要移除旧的进程.为了决定保持哪个进程及杀死哪个进 程,Android将每个进程放入一个基于运行于其中的组件的重要性等级和这些组件的状态.重要性最低的进程首先被杀死,然后是次低,以此类推.总共有5 个层次等级.下列清单按重要性顺序列出: 前台进程,用户当前工作所需要的.一个进程如果满足下列任何条件被认为是前台进程: 它正运行着一个正在与用户交互的活动(Activity对象的onResume()方法已经被调用). 它寄宿

Android编程中activity的完整生命周期实例详解_Android

本文实例分析了Android编程中activity的完整生命周期.分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误.这篇文章很长,希望不要耽误大家的时间- 今天不会涉及太多关于activity栈的东西,主要说activity自身的生命周期 区分几个概念 1 Activity 官方解释为 "An Activity is an application component that pro

Android Activity 横竖屏切换的生命周期_Android

前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据 横竖屏切换生命周期 1.启动程

Android编程中activity的完整生命周期实例详解

本文实例分析了Android编程中activity的完整生命周期.分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误.这篇文章很长,希望不要耽误大家的时间- 今天不会涉及太多关于activity栈的东西,主要说activity自身的生命周期 区分几个概念 1 Activity 官方解释为 "An Activity is an application component that pro

MEF程序设计指南八:部件生命周期(Parts Lifetimeime)托管

MEF中的每一个可进行动态装配的导出部件都是具有生命周期的,在没有特别需求的情况下一般都没有对生命周期进行管理,而实际上 MEF已为每一个部件进行了默认的生命周期管理,MEF的生命周期分为三种:Any.Shared及NonShared,被定义在 System.ComponentModel.Composition.CreationPolicy枚举对象中. namespace System.ComponentModel.Composition { public enum CreationPolicy

Castle IOC容器组件生命周期管理

主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会使用Singleton模式.在Castle IOC中,它支持我们对于组件的实例进行控制,也就是说我们可以透明的管理一个组件拥有多少个实例.Castle IOC容器提供了如下几种生命处理方式: l Singleton:一个组件只有一个实例被创建,所有请求的客户使用程序得到的都是同一个实例,同时这也是C

实例探究Android应用编写时Fragment的生命周期问题_Android

管理fragment的生命周期有些像管理activity的生命周期.Fragment可以生存在三种状态: Resumed: Fragment在一个运行中的activity中并且可见. Paused: 另一个activity处于最顶层,但是fragment所在的activity并没有被完全覆盖(顶层的activity是半透明的或不占据整个屏幕). Stoped: Fragment不可见.可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了.此状态的frag