图1:Activity生命周期的简化图,就像一个阶梯金字塔。这图像表明每个状态中是怎么样使用回调函数使得恢复状态回到顶端,或者降低状态到达底部。Activity可以从Paused状态和stopped状态恢复到Resumed状态。

正确使用你的Activity生命周期函数去保障应用程序的良好表现,必须注意很多方面,包括下面的内容:

  • 当用户接听电话或者转去另外一个应用程序时,不要让程序崩溃。
  • 当用户没有激活使用它时,不消耗宝贵的系统资源。
  • 当用户离开你的应用程序并在稍后的时间返回,不会丢失用户的进度。
  • 当用户屏幕在横向与纵向旋转切换时,不会崩溃或者丢失用户进度。

这其中只有3种状态是静态的。这意味着,activity 只能在这3种状态之一中存在一段时间:
Resumed状态

  • 在这种状态下,该Activity在前台运行,用户可以与它进行交互。(有时也简称为“running”状态。)

Paused状态

  • 在这种状态下,该Activity被部分遮蔽(被其他在前台的半透明或不覆盖整个屏幕的活动遮住)。此状态不接受用户输入,并且不能执行任何代码。

Stopped状态

  • 在这种状态下,该活动是完全隐藏,不可见的,可视为存在于后台。虽然停止,活动实例和所有成员变量如状态信息将被保留,但不能执行任何代码。

其他的状态(**created状态**和**started状态**)都是非常短暂而且系统通过调用函数使得非常快地转到下一状态。换句话说,当系统调用了onCreated()之后,非常快地就调用了onStart()方法使得进入下一状态,而又马上调用了onResumed又进入了下一状态。

onCreate()

你必须在onCreate()方法中操作一些在整个生命周期内只会调用一次的程序启动逻辑内容。例如,可以在onCreate()方法中定义用户界面的或者初始化一些类变量的内容。

如声明用户界面(在XML布局文件中定义),定义成员变量,并配置UI。

onDestroy()

大多数的应用程序并不需要实现这个函数,因为局部类的引用将会和Activity一起销毁,而一些清理工作,主要也是在onPaused()和onStop()中。然而,如果你的Activity包含了有在onCreated()或者其他持续性运行的资源在后台线程运行,您就应该在onDestroy()方法中清除掉它们,而避免内存泄露。

onPause()

当系统调用一个activity中的onPause()方法, 从技术上讲意味着这个activity仍然处于部分可见的状态,但是大多数时候,那意味着用户正在离开这个activity并很快会进入停止状态. 通常应该在onPause()回调方法里面完成以下操作:

  • 停止会耗费CPU的动画或者是其他正在运行的操作。

  • 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿)。

  • 释放系统资源,例如广播接收器, 传感器(如GPS), 或者是其他任何当你的activity暂停时会影响到电量而用户并不需要的资源。

通常,不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储上。仅仅确认用户期待那些改变能够被自动保存的时候(例如书写邮件草稿时)才可以把那些数据存到永久存储上。然而,应该避免在onPause()时执行CPU密集的工作,例如写数据到数据库,因为它会导致切换到下一个activity的可视过程变得缓慢(那些重负荷的操作应该放到onStop()方法中完成)。

如果activity实际上是要被Stop,为了切换的顺畅应该减少在OnPause()方法里面的工作量。

Note: 当Activity处于暂停状态,Activity实例是驻留在内存中的,并且在Activity 恢复的时候重新调用。因而不需要在恢复到Resumed状态的一系列回调方法中重新初始化组件。

onResume()

你的activity每次来到最前台,系统都会调用这个方法,包括第一次创建的时候。所以,在实现onResume()方法时应该初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入恢复状态都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)。

onStop()

当activity调用onStop()方法时,该activity不再可见并且应该释放所有不再需要的资源。一旦activity停止了,系统可能会摧毁activity的实例以回收内存,甚至,系统会不执行activity的onDestroy()回调方法而直接杀死你的app进程, 因此需要使用onStop()来释放资源,从而避免内存泄漏。

尽管onPause()方法是在onStop()之前调用,通常应该使用onStop()来执行CPU密集型的关闭操作,例如把数据写入数据库。

onRestart()&onStart()

当Activity从Stopped状态回到前台时会调用onRestart(),系统还会再调用onStart()方法,onStart()方法在每次Activity可见时都会被调用(不管是重新启动还是第一次创建的时候)。onRestart()方法则是只在Activity从stopped状态恢复时才会被调用,因此可以使用它来执行一些特殊的恢复工作,请注意activity之前应是被stop而不是destrory。

由于onStop()方法要做清除所有Activity资源的操作,在重新启动Activtiy时需要重新实例化被清除的资源,同样,在Activity第一次创建时要实例化那些资源。因为系统会在创建Activity与从停止状态重启Activity时都会调用onStart(),应该使用onStart()作为onStop()所对应的方法。

例如:因为用户很可能在回到Activity之前需要过一段时间,所以onStart()方法是一个比较好的用来验证某些必须的功能是否已经准备好的地方。

 LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gpsEnabled)

由于会在onStop方法里面做释放资源的操作,大多数app不需要在onDestory方法中做太多事。onDestory方法是最后的去清除那些可能导致内存泄漏的地方,因此需要确保添加的线程都被销毁并且所有像方法跟踪之类的长效操作都被停止。

onSaveInstanceState()

当Activity开始Stop时,系统会调用onSaveInstanceState(),因此Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,例如在EditText组件中的文本或者是ListView的滑动位置。
为了给Activity保存额外的状态信息,必须实现onSaveInstanceState()并增加键值对到Bundle对象中.

警告: 必须要调用onSaveInstanceState()方法的父类实现,这样默认的父类实现才能保存视图状态的信息。

onCreate()&onRestoreInstanceState()

当Activity在被Destory后进行重建,可以从系统传递给Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。

因为onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,所以必须在尝试读取Bundle对象前检查它是否为空。如果它为空,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

onRestoreInstanceState()方法会在onStart()方法之后执行。系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需要检查Bundle是否为空。

警告: 与前面的一样,总是需要调用onRestoreInstanceState()方法的父类实现,这样默认的父类实现才能保存视图状态的信息。

Android Activity 注意笔记的更多相关文章

  1. Android Activity学习笔记(一)

    Activity为Android应用的四大组件之一,提供界面来与用户完成交互等操作.其中Activity的生命周期的知识这里做个笔记. Activity的生命周期由以下几个部分组成: 1.onCrea ...

  2. Android Activity学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html 最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函 ...

  3. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  4. Android群英传笔记——第八章:Activity与Activity调用栈分析

    Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...

  5. 【Android4高级编程笔记】深入探讨Android Activity

    创建Activity 要创建一个新的Activity,需要对Activity类进行扩展,在新类定义用户界面并实现新的功能. 视图是用来显示数据和提高用户交互的Ui控件.Android提供了多个布局类, ...

  6. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  7. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  8. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  9. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

随机推荐

  1. Spring 3.1 Environment Profiles--转载

    原文地址:http://gordondickens.com/wordpress/2012/06/12/spring-3-1-environment-profiles/ Profiles Spring ...

  2. [转]DataTable用中使用Compute 实现简单的DataTable数据的统计

    本文转自:http://blog.csdn.net/zwxrain/article/details/252285 調用格式: object DataTable.Compute(string expre ...

  3. [改善Java代码]枚举项的数量限制在64个以内

    为了更好的使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用方法都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举 ...

  4. [改善Java代码]数组的真实类型必须是泛型类型的子类型

    List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...

  5. poj 2373 单调队列优化背包

    思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...

  6. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...

  7. Linux 文件/文件夹操作命令

    1 cd命令 命令格式:cd  [目录名]    (cd和目录之间使用空格隔开) cd      进入用户主目录: cd  ~  进入用户主目录: cd  -  返回进入此目录之前所在的目录: cd  ...

  8. saltstack实战4--综合练习3

    Saltstack配置管理-业务引用haproxy 在业务模块里写它的配置 各个业务是不同的,这里有差异性,所以没写在配置模块里. 对minion02也执行安装haproxy [root@master ...

  9. ZooKeeper(3.4.5) - 配置伪集群模式

    1. 准备 Java 运行环境,需要安装 Java1.6 或更高版本的 JDK. 2. 下载 ZooKeeper 的稳定版本 zookeeper-x.x.x.tar.gz,将其解压,约定目录名称为 % ...

  10. Android的ListView分页功能

    一.功能分析----ListView“加载更多”,功能如下图所示: 这个效果是当你上拉拖动页面时(注意有区别于下拉刷新),页面提示正在加载,2秒后显示留言更多内容:具体功能知道那我就来讲解下如何实现这 ...