`
hehailin1986_163.com
  • 浏览: 154484 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

[转][Android研究手记2]Activity 的运行时生命周期模型

阅读更多
原文:http://hkbarton.sacredfir.com/?p=66
由于在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被系统结束。


分享到:
评论

相关推荐

    Android开发手记一_NDK编程实例

    ### Android开发手记一_NDK编程实例 #### 一、开发环境的搭建 在开始具体的NDK编程之前,首先需要确保开发环境已经被正确地搭建起来。对于初次接触Android NDK开发的朋友来说,拥有一个良好的环境配置是至关重要的...

    Android学习手记:第一个应用程序!

    在这个例子中,你可能看到一个简单的`onCreate()`方法,它是每个Activity生命周期的起点,这里通常用于初始化UI元素。`activity_main.xml`则是XML布局文件,定义了用户界面的结构。 在`activity_main.xml`中,你...

    Android开发手记--环境配置.pdf

    在Android开发过程中,环境配置是至关重要的第一步。这篇“Android开发手记--环境配置”主要介绍了如何在Windows XP环境下,...在实际开发中,还需要学习更多的API、生命周期管理、网络通信、数据库操作等方面的知识。

    非常摄影手记玩转单反相机

    非常摄影手记玩转单反相机,,2天玩转单反相机,电子工业出版社

    Android学习手记三:完善程序!

    这篇“Android学习手记三:完善程序!”将深入探讨如何通过理解和运用源码,以及合理利用工具来提升应用的质量。 首先,源码的理解是Android开发中的关键。阅读和理解开源库或系统的源码,可以让我们更好地了解内部...

    Android开发手记--环境配置[收集].pdf

    Android 开发手记 -- 环境配置 Android 开发手记是基于 Linux 内核的手机系统,使用 MyEclipse + Windows XP 作为开发工具,当然在 Linux 下开发是更好的选择。以下是 Android 开发环境配置的步骤: 第一步:下载 ...

    变速齿轮 研究手记 变速齿轮 研究手记

    变速齿轮是一种古老的软件工具,主要用于改变计算机程序的运行速度,特别是在游戏领域有着广泛的应用。它允许用户调整程序的执行速度,比如加快或减慢游戏的节奏,以便更好地进行调试、学习或者体验。在本文中,我们...

    Android SDK安装手记

    ### Android SDK安装与配置知识点详解 #### 一、Android SDK简介 Android SDK(Software Development Kit)是Android应用程序开发的核心工具集,它包含了开发者创建、测试和调试Android应用所需的所有资源。SDK不仅...

    Android性能优化手记

    在Android平台,性能稳定性通常涉及到应用的响应速度,以及在各种不同硬件和软件环境下运行时的稳定程度。性能优化工作包括但不限于监控和改进应用的启动速度、运行时的帧率、避免应用崩溃等。 2. 内存管理:...

    oracle DBA 手记 2/3

    oracle DBA 手记 oracle DBA 手记part2 of 3

    【百度AR】【Android】百度AR平台demo工程实践手记

    在进行demo工程的运行配置时,需要上传资源包,上传后会经历一个审核阶段。开发者需要进入审核页面并点击“审核通过”来完成资源包的审核流程。这个步骤是必需的,因为通过审核的资源包是后续操作的基础。 具体到...

    IT项目经理成长手记.zip

    其次,书中强调了项目生命周期管理的重要性,包括项目的启动、规划、执行、监控和收尾阶段。每个阶段都详尽阐述了具体的工作内容和方法,例如需求收集、制定项目计划、风险评估、进度控制和质量保证。此外,还提到了...

    MATLAB GUI设计学习手记(第2版)_matlab_GUI_

    本资料“MATLAB GUI设计学习手记(第2版)”主要面向初学者,旨在帮助他们快速掌握GUI的设计技巧。 GUI(图形用户界面)在MATLAB中的设计是通过GUIDE(GUI Development Environment)工具完成的,它提供了一个可视化...

    Android中使用文件存储实现手记应用的代码清单.pdf

    同时,由于Android 6.0及以上版本需要动态申请权限,所以在实际开发时还需要考虑运行时权限管理。 总的来说,这个简单的手记应用示例展示了如何在Android中使用文件系统保存用户数据,是理解Android文件存储机制的...

    Oracle_DBA手记1_2_3完整版.part02

    一共三部,共16卷,别人制作的时候就是16卷.上传我都有点闲麻烦。 高清 中文 完整版 Oracle_DBA手记第1部 ...Oracle DBA手记2-数据库诊断案例与内部恢复实践 292页 Oracle DBA手记:数据库诊断案例与性能优化实践 407页

    Oracle_DBA手记2-数据库诊断案例与内部恢复实践.pdf

    Oracle_DBA手记2-数据库诊断案例与内部恢复实践.pdf

    IT项目经理成长手记

    IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记

    IT项目经理成长手记PDF

    IT项目经理成长手记PDF,非常不错的资源

    《从零开始玩转PIC 之 旋转时钟》(匠人手记)

    《从零开始玩转PIC之旋转时钟》是《匠人手记》系列中的一个章节,由程序匠人撰写,详细介绍了如何利用PIC单片机设计并制作一款旋转时钟。这一章节不仅提供了理论知识,还包含了实际的操作指南,对于初学者来说是一个...

    《AI大模型应用》-大语言模型手记.zip

    个人深耕AI大模型应用领域积累的成果,希望对您有所帮助。有大模型账号、环境问题、AI大模型技术应用落地方案等相关问题,欢迎详聊,能为您解决问题是我的荣幸! 个人深耕AI大模型应用领域积累的成果,希望对您有所...

Global site tag (gtag.js) - Google Analytics