Activity 生命周期及其栈管理方式
Activity 生命周期
Android 系统用栈的形式管理 Activity , 当新的 Activity 被创建是, 会被放置到栈顶, 这个 Activity 会进入到运行状态, 而前一个 Activity 则会被压入栈, 直到新的 Activity 退出, 否则不会出现在前台。
单个 Activity 的生命周期状态以及生命周期方法
根据 Android 文档, 每一个 Activity 都有四个状态, 它们分别是:
- 当 Activity 位于屏幕的最前面(栈顶),称之为 运行(活动)状态: ;
- 当 Activity 失去焦点, 但是依旧可见, 比如被非全屏的对话框遮住部分, 称之为 暂停状态 , 暂停的 Activity 依然是活动的, 但是当系统内存严重不足时, 有可能被系统结束;
- 当 Activity 完全不可见时, 称之为 停止状态 , 这时 Activity 依然保持其状态以及成员信息, 不过由于此时 Activity 对用户不可见, 当系统其它地方需要内存时, 经常会被结束;
- 当 Activity 由不可见变成可见时, 称之为 重启状态 , 这时 Activity 必须迅速恢复它以前的状态。
下图表示 Activity 在这四种状态之间切换的生命周期, 以及状态切换时调用的对应的方法:

Activity 生命周期中的各个方法描述如下:
- onCreate() 当 Activity 首次创建时调用, 这里通常的工作是创建视图, 绑定数据到列表等。 这个方法还有一个 Bundle 参数, 如果这个 Activity 之前由冻结的状态, 这个状态将包含在里面。 之后, 通常会接着调用 onStart() 方法。
- onRestart() Activity 已经被停止, 在其被重新开始之前调用。 接下来回调用 onStart() 方法。
- onStart() 当 Activity 变到用户可见时调用, 接下来如果 Activity 变成不可见的话, 将会调用 onStop() , 否则将调用 onResume() 。
- onResume() 当 Activity 开始能和用户交互时调用, 此时的 Activity 位于栈顶, 接下来通常会调用 onPause() 。
- onPause() 当系统准备开始一个新的 Activity 或者重置一个已有的 Activity 时调用。 通常需要在这里进行保存数据、 停止动画以及其它占用 CPU 资源的活动等。 这个方法完成之前, 下一个 Activity 不会继续, 所以这个方法的必须较快的完成。 接下来如果 Activity 又回到栈顶将调用 onResume() , 如果 Activity 变的不可见, 将调用 onStop() 。
- onStop() 当 Activity 不可见时调用, 如果 Activity 变的可见, 将会调用 onRestart() , 如果 Activity 将销毁, 调用 onDestroy() 。
- onDestroy() 这是 Activity 被销毁之前最后一次调用, 可能是调用了 Activity 的 finish() 方法, 或者系统要回收资源, 这两者可以通过 isFinishing() 方法进行区别。
多个 Activity 的栈管理方式
多个 Activity 之间采用的是栈道管理方式, 当用户启动新的 Activity 时, 新启动的 Activity 位于栈顶,当用户按后退按钮时, 栈顶的 Activity 被推出栈道并销毁, 如下图所示:

生命周期测试代码
我们在上次创建的程序中添加 Activity 的生命周期代码, 并加入一些输出, 以便清晰的理解:
[Activity(Label = "MyFirstApp", MainLauncher = true)]
public class MainActivity : Activity {
public const string ExtraMessage = "Cn.Beginor.MyFirstApp.MainActivity.ExtraMessage";
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
/** 其它代码省略 **/
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnStart() {
base.OnStart();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnResume() {
base.OnResume();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnPause() {
base.OnPause();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnStop() {
base.OnStop();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnRestart() {
base.OnRestart();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
}
protected override void OnDestroy() {
base.OnDestroy();
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
Android.Util.Log.Debug("Debug", this.GetType().Name + "." + this.IsFinishing);
}
}
以上是 MainActivity 添加的生命周期代码, 由于代码完全一直, 就不在贴出来了。 接下来开始调试, 首先会启动 MainActivity , 从输出窗口能看到下面的提示:
MainActivity.OnCreate
MainActivity.OnStart
MainActivity.OnResume
点击“发送”按钮,启动 SecondActivity ,看到下面的提示:
MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop
点击返回按钮, 返回 MainActivity , 得到的提示如下:
SecondActivity.OnPause
MainActivity.OnRestart
MainActivity.OnStart
MainActivity.OnResume
SecondActivity.OnStop
SecondActivity.OnDestroy
SecondActivity.IsFinishing = True
再次点击“发送”按钮,启动 SecondActivity ,看到下面的提示(与第一次是一致的):
MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop
这时, 如果点击 Home 按钮, 会得到下面的提示:
SecondActivity.OnPause
SecondActivity.OnStop
点击“最近程序”按钮, 打开 MyFirstApp , 会看到下面的提示:
SecondActivity.OnRestart
SecondActivity.OnStart
SecondActivity.OnResume
如果在 MainActivity 点击“返回”按钮, 应用将会退出, 可以看到下面的提示:
MainActivity.OnPause
MainActivity.OnStop
MainActivity.OnDestroy
MainActivity.IsFinishing = True
至此, 整个生命周期测试完成, 有了上面的测试, 应该可以对 Android 的 Activity 生命周期有一个比较清楚的认识。
张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/
Activity 生命周期及其栈管理方式的更多相关文章
- 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别
探讨C++ 变量生命周期.栈分配方式.类内存布局.Debug和Release程序的区别(一) 今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给 ...
- android学习笔记 activity生命周期&任务栈&activity启动模式
activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)
一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- Android-管理Activity生命周期 -重新创建Activity
按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...
- Android-管理Activity生命周期 -停止和重启Activity
停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- Android-管理Activity生命周期 -开始一个Activity
很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...
随机推荐
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- BZOJ2904
找了一个晚上的资料,拼凑出来这么一个东西: 1) 如果是完全平方数返回12) 如果可以表示成形如$x^2+y^2$的形式输出2.这要求该数质因数分解后形如$4k+3$的质因数次数都是偶数.3) 如果该 ...
- 记录:js删除数组中某一项或几项的几种方法
1:js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...
- ENGINE=InnoDB
最开始用MySQL Administrator建数据库的时候,表缺省是InnoDB类型,也就没有在意.后来用Access2MySQL导数据的时候发现只能导成 MyISAM类型的表 区别如下原来是MyI ...
- CSS用Id选择器在本页写样式
<title>静夜思</title><style type="text/css">#red{color:#ff0000; font-weight ...
- poj 1833
http://poj.org/problem?id=1833 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排 ...
- explict关键字
[本文链接] http://www.cnblogs.com/hellogiser/p/explict.html [分析] explicit 只对构造函数起作用,用来抑制隐式转换. Suppose yo ...
- DP:Apple Catching(POJ 2385)
牛如何吃苹果 问题大意:一个叫Bessie的牛,可以吃苹果,然后有两棵树,树上苹果每分钟会掉一个,这只牛一分钟可以在两棵树中往返吃苹果(且不吃地上的),然后折返只能是有限次W,问你这只叫Bessie的 ...
- Java性能优化权威指南-读书笔记(四)-JVM性能调优-延迟
延迟指服务器处理一个请求所花费的时间,单位一般是ms.s. 本文主要讲降低延迟可以做的服务器端JVM优化. JVM延迟优化 新生代 新生代大小决定了应用平均延迟 如果平均Minor GC持续时间大于应 ...
- MVC登录案例
1.在Controllers文件夹里面新建一个控制器HomeController;2.在默认的Index方法里面添加一个视图,名字跟Controller中的方法名一样叫Index,添加后的视图文件会在 ...