Android Activity 注意笔记
图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 注意笔记的更多相关文章
- Android Activity学习笔记(一)
Activity为Android应用的四大组件之一,提供界面来与用户完成交互等操作.其中Activity的生命周期的知识这里做个笔记. Activity的生命周期由以下几个部分组成: 1.onCrea ...
- Android Activity学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html 最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
- 【Android4高级编程笔记】深入探讨Android Activity
创建Activity 要创建一个新的Activity,需要对Activity类进行扩展,在新类定义用户界面并实现新的功能. 视图是用来显示数据和提高用户交互的Ui控件.Android提供了多个布局类, ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
---------------------------------------------------------------------------------------------------- ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
随机推荐
- 通用PE u盘启动盘制作
导读 通用pe工具箱是现在最老牌的的U盘装系统和维护电脑的专用工具之一,一键式制作.操作简单便捷,几乎100%支持所有U盘,不再为装机烦恼们,抓紧时间下载通用pe工具箱体验下吧. 准备工作 ①从通用p ...
- zh-cn,zh-tw,en-us,en-gb等网页语言代码一览表
zh-cn 简体中文zh-tw 繁体中文da-dk 丹麦语nl-nl 荷兰语en-us 英语fi-fi 芬兰语fr-fr 法语de-de 德语it-it 意大利语j ...
- proxy代理类
package cn.hncu.proxy.rent; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Meth ...
- windows下使用VirtualEnv
在开发Python应用程序的时候,有时会开发多个应用程序,那这些应用程序都会共用一个Python.如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?这种情况下,每个应用可能需要各 ...
- XML XmlDocument
1.SelectSingleNode(xPath) xPxth:xml/cam/type 一层一层递进
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...
- ip 子网掩码 网关 DNS
这一篇文章也很好: 原文引用于: http://www.cnblogs.com/jiqing9006/p/3365939.html 内外网ip: IP地址: IPv4地址分为A.B.C.D.E五类, ...
- [改善Java代码]不要让四舍五入亏了一方
建议25: 不要让四舍五入亏了一方 本建议还是来重温一个小学数学问题:四舍五入.四舍五入是一种近似精确的计算方法,在Java 5之前,我们一般是通过使用Math.round来获得指定精度的整数或小数的 ...
- [未完成][Mooc]关于Linxu的总结(一)
视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...
- 转: 基于nginx的hls直播系统
转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于nginx的h ...