Android SDK上手指南:Activity与生命周期
Android SDK上手指南:Activity与生命周期
Activity生命周期并不仅仅在用户运行应用程序之后才开始生效,事实上它也影响着用户切出以及切回应用时得到的不同反馈。当我们开发一款应用时,首先需要牢记一点:用户会经常在执行过程中、在我们的应用与其它应用之间频繁切换。
介绍
Activity生命周期并不仅仅在用户运行应用程序之后才开始生效,事实上它也影响着用户切出以及切回应用时得到的不同反馈。当我们开发一款应用时,首先需要牢记一点:用户会经常在执行过程中、在我们的应用与其它应用之间频繁切换。取决于用户的操作方式,同一款应用程序有时在前台运行、有时则在后台运行。大家必须保证自己的应用能够就会这类情况,并在此类切换过程中及时保存并恢复数据。再次提醒各位,这一过程对于某些特定应用程序略有不同——例如功能性组件。
1.回调方法
第一步
为了控制Activity处于不同状态下时应用程序的运行方式,例如当用户切出或者切回应用,大家可以选择多种处理方法。这类方法也就是Activity生命周期回调方法。Android系统会在我们的Activity进入某种特定状态后调用这些方法,从而通过一系列步骤确保我们的应用程序能够继续起效、不至于丢失数据而且在用户不与之交互时不会使用非必要性资源。每一种回调方法都会让我们的应用进入一种可能的状态。
如果大家之前曾经接触过Java应用程序的编程工作,那么应该已经发现Android应用程序的启动遵循另一种方式。与Java应用直接使用主方法不同,Android在启动后会首先执行主Activity类中的onCreate方法。请记住,我们已经在清单中将该类指定为主启动Activity。Activity会首先回调onCreate方法,相当于重复用户启动应用程序后的流程。这时候onCreate方法会使应用程序进入Created状态。
开发者指南当中通过示意图以直观方式介绍了生命周期、回调方法以及状态的概念。其中onResume方法负责提供Resumed状态,这时我们的应用程序可以接受用户的直接操作。其它各类回调方法都以onResume为核心,即将应用程序引导至Resumed状态或者从该状态脱离、启动该状态或者将其停止。
对于大部分应用程序来说,我们只需要使用一部分回调方法,但最起码要用到onCreate。虽然使用频率不高,但了解全部回调及状态的作用将帮助我们了解自己的应用程序在运行及停止运行时,Android系统会受到怎样的影响。一般情况下,大家需要保证用户能够在任何操作过程切换出去之后、都能顺利恢复到之前的运行状态;如果他们通过导航选择前进或者后退,应用则需保存全部必要数据并释放不必要占用的硬件资源。
第二步
我们的应用程序可能处于以下五种状态,分别为:Created、Started、Resumed、Paused以及Stopped。另有七种回调方法能够让应用进入或者脱离上述状态,它们分别是:onCreate、onStart、onRestart、onResume、onPause、onStop以及onDestroy。这些方法能够让我们的应用程序在可能的状态之间进行切换,而且某些情况下切换速度会很快。通常来说,大家可以认为自己的应用程序始终处于resumed、paused或者stopped这三种状态之下,因为其它状态都是暂时性的。
当我们的应用程序正处于运行当中且用户与之进行操作交互,这时的应用状态为Resumed;当另一个Activity处于前台但仅仅使我们的应用被部分隐藏时,这时的应用状态为Paused——在这种状态下用户无法再与应用进行交互。当我们的应用完全处于后台之下,而且用户既无法操作、也无法观看到它时,其状态即为Stopped。在这种状态下Activity会保留之前的所有数据,但无法加以执行。
2.进入Resumed状态
如我们所知,主Activity会在应用程序启动时开始运行,onCreate方法也将执行、从而让我们准备该类所需要的Activity UI以及全部数据条目。我们创建的大部分应用当中都包含不只一个Activity,其它Activity会在用户与应用程序进行操作交互时启动。大家可以利用以下代码通过Intent类启动另一个非主Activity:
这代表着应用程序包中另一个名为“About”的Activity类。大家可以通过选择自己的源码包而后选择“文件”、“新建”、“类”的方式在Eclipse当中创建一个新Activity,而后将该Android Activity类选定为超级类。请记住,每一个Activity都必须在我们的应用程序清单当中列出。大家还可以利用Intent类实现不同Activity之间的数据转移。
当一个Activity处于运行当中时,onCreate方法也在同时执行,因此除了把其它Activity类列入清单之外、大家也能够以与主Activity类似的方式在应用程序当中处理这些类。我们也可以为每个Activity创建一个布局文件,并通过设置让其使用与主Activity同样的技术机制。
在某个Activity的onCreate方法开始执行之后,onStart与onResume两个方法也将开始执行, 从而使该Activity处于Resumed状态、并在后续执行过程中根据情况转换为Created以及Started状态。
我们的Activity可以通过不只一种方式进入Resumed状态,应用程序启动只是其中最基本的途径。如果Activity处于Paused或者Stopped状态,则应用程序切换至当前之后该Activity将直接进入前台运行模式,且无需重复调用onCreate方法。如果大家的应用从Paused状态切换回Resumed状态,则Activity的onResume方法将开始执行。如果该应用由Stopped状态切换回运行状态,则执行onRestart方法、而后依次为onStart与onResume方法。
3.进入Destroyed状态
第一步
当我们的应用程序处于退出或者隐藏状态下,则Resumed就会转变为Destroyed。这时候,onPause方法会将应用的Activity由运行时的Resumed状态转换为Paused状态。在onPause当中,大家应当停止任何需要占用资源的任务,例如动画播放、传感器数据处理以及广播接收等等。如果onPause正在执行,那么onStop也可以开始执行,因为用户此时通常已经通过导航退出了我们的应用程序。大家还可以利用onPause方法进行数据保存——虽然通常来说数据保存工作由onStop方法来负责最为妥当。
正如我们之前曾经提到,大家的Activity能够通过onResume方法从Paused状态重新回归至Resumed状态。这意味着我们可以利用onResume来恢复任何我们之前在onPause当中停止或者发布过的内容。不过大家还需要记住一点,onResume在其它情况下也会付诸执行,例如在应用程序启动时。
第二步
在onPause之后,如果应用程序进入Stopped状态,那么onStop也将开始执行。在这种情况下,onRestart、onStart以及onResume等方法仍然能够使应用程序重新回到Resumed状态。在onStop中,大家应当尽可能压缩只在必要数据的操作量,例如向数据库中写入内容。请大家确保在onStop当中囊括了所有应用程序所使用的资源,从而避免该应用在被彻底关闭之后导致内存溢出问题。
这套系统会在应用程序从resumed状态切换至stopped状态后保存特定数据,例如视图中需要显示的内容。当某个Activity从Stopped状态恢复到Resumed状态时,onRestart、onStart以及onResume方法都会开始执行。不过onStart与onResume的执行情况有所不同——例如在应用程序启动之时。而onRestart方法只会在应用程序从Stopped状态恢复至前台之后才会执行,这样大家就能利用它来恢复任何保存在onStop当中的运行内容。
提示:当大家从一个Activit之下启动另一个Activity时,前者会进入Stopped状态。如果用户随后利用后退按钮再次由后者返回先前的Activity当,那么前者的onRestart方法就会开始执行。
第三步
如果大家的应用程序即将彻底关闭,例如我们的当前Activity被从系统当中移除,则onDestroy方法会开始执行。尽管这是在我们的Activity完全消失之前执行的最后一个方法,大家仍然不应该简单地将所有内容一股脑清除。事实上,我们需要利用onStop或者onPause来处理结束工作。当然也有例外情况,如果应用程序的后台进程仍然处于运行状态,那么这时候大家应该在onDestroy当中将其停止。
在onDestroy执行之后,如果用户通过导航返回应用程序Activity,则对应onCreate方法将再次被启动。一般情况下,大家可以假设onPause与onStop会在onDestroy之前执行。不过如果大家明确调用finish方法来结束一个Activity,则只有onDestroy会被执行。
在多数情况下,我们并不需要为应用程序当中的生命周期回调问题投入过多精力,因为大家完全可以利用onCreate方法的参数实现数据保留效果。在Activity onCreate方法当中,Bundle参数负责如前所述自动进行视图信息保存。不过大家也可以利用该对象保存更多数据内容,例如记录用户与应用程序之间的交互所产生的变量更新。要实现这一目标,大家可以在Activity类当中使用onSaveInstanceState方法,完成数据键值对的编写之后、我们就可能在onCreate当中将其恢复。
提示:当用户改变设备显示模式时,也就是在纵向及横向模式间进行切换,我们的Activity实际上会经历重新创建、onCreate也会被再次执行。这一过程被我们称为配置变化。在这种情况下,系统会假设大家需要重新创建Activity,例如大家在每种显示模式下使用不同的布局方案。不过在多数情况下,大家可能不希望系统照此办理。为了避免我们的Activity在显示模式转换时发生重新创建,大家可以从两种解决方式中作出选择:向清单内的Activity添加“android:configChanges”属性,或者调整我们的Activity结构、利用我们在配置变量时所保留的Fragments。
总结
当大家开始学习如何为Android平台开发应用程序时,Activity当中所涉及的大量状态与回调方法可能会成为很多难题乃至混乱的根源。然而在大多数情况下,我们只需要采用最低数量的方法以确保自己的应用程序有能力提供用户所预期的功能与效果。在本系列教程的下一篇当中,我们将共同了解部分常用Android类,大家很可能会在自己的第一款应用当中与它们打交道。在此之后,我们将着眼于Android代码示例、需要了解的应用程序发布知识以及其它一些关于今后进一步学习的建议。
原文链接:
http://mobile.tutsplus.com/tutorials/android/android-sdk-activities-lifecycle/
Android SDK上手指南:Activity与生命周期的更多相关文章
- Android SDK上手指南:知识测试
Android SDK上手指南:知识测试 2014-01-22 10:00 核子可乐 译 51CTO 字号:T | T 在从零开始学习Android开发系列教程当中,我们已经了解了为Android平台 ...
- Android SDK上手指南:下一步学习方向
Android SDK上手指南:下一步学习方向 2014-02-28 11:01 核子可乐 译 51CTO 字号:T | T 到目前为止,我们已经介绍过的知识足以帮助大家从非常理想的起点开始进行And ...
- Android SDK上手指南:示例项目
Android SDK上手指南:示例项目 2013-12-26 15:40 核子可乐译 51CTO 字号:T | T Android SDK示例项目中的应用能够执行种种功能,例如各类用户界面元素.数据 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android应用程序中Activity的生命周期
Android应用程序中Activity的生命周期 对于Android来说Activity的生命周期是非常的重要,尤其是对于新学者来说,只有充分了解了Activity的生命周期,才能写出优良用户体验的 ...
- Android SDK上手指南:应用程序发布
Android SDK上手指南:应用程序发布 2013-12-26 15:47 核子可乐译 51CTO 字号:T | T 在今天的文章中,我们将重点探讨通过Google Play软件商店进行应用程序发 ...
- android学习四(Activity的生命周期)
要学好活动(Activity).就必需要了解android中Activity的声明周期.灵活的使用生命周期.能够开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的 ...
- 【Android】11.1 Activity的生命周期和管理
分类:C#.Android.VS2015: 创建日期:2016-02-21 一.基本概念 1.必须理解这些方法,否则你编的程序根本就没法在实际项目中使用 当然,如果仅仅是为了玩玩,或者仅仅是作为例子为 ...
- Android艺术——深看Activity的生命周期
探究Activity的生命周期 1.典型情况下的生命周期分析:onCreate 初始化工作,加载布局资源和数据:onStart ac正在启动但是无法交互,后台:onResume ac可见,显示在前台: ...
随机推荐
- 如何打开rdb文件
后缀名是RDB用什么软件打开不能用记事本打开后是乱码不知用什么软件写入的... RDB文件是QQ2009SP以后的替代DB文件的一种新的文件格式,是一种数据库文件请下载 百度搜索下载:rdb打包解包工 ...
- Http学习(二)
使用首部字段是为了给浏览器和服务器提供报文主体大小.所使用语言.认证信息等 4种首部字段类型 通用首部字段 请求首部字段 响应首部字段 实体首部字段 详细说明: HTTP首部字段类型 通用首部字段: ...
- AtCoder ABC 129E Sum Equals Xor
题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_e 题目大意 给定一个二进制表示的数 L,问有多少对自然数 (a, b) 满足 $a + b ...
- Java中循环体的初步了解以及另一种随机数的获取方法
Math中的相关操作 随机数 Java中除了可以直接导入Random类,获取随机数,还可以通过本身自带的Math方法去获取随机数.Math.random()可以产生随机小数,区间范围为[0.0,1.0 ...
- C# 中的三个高级参数 ref
今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问 引用类型就传的就是地址,值类型传的就是值,可是还仍有那么多人迷惑,网上虽然流传着很多ref 的相关文 ...
- CAS机制详解
目录 1. 定义 2. 实现原理 3. 无版本号CAS实战说明 4. CAS机制在Java中的应用 5. CAS的缺点 1. CPU开销过大 2. 不能保证代码块的原子性 3. ABA问题 6. JA ...
- cmd以管理员打开
- 创建你的 /proc 文件
一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用: struct proc_dir_ent ...
- js怎样截取以'-'分割的字符串
在日期2019-09-01,怎样截取年只要月和日,下面是主要代码 var aa = '2019-09-01'; var bb = aa.split('-'); console.log(bb);//打印 ...
- python中检测mysql的主键唯一性异常
有两种方法: 1.直接检测是什么异常(查mysql文档找出异常代码) import os import mysql_operate.mysql_connect as mysql import re d ...