Activity生命周期
来源:互联网 发布:斯坦纳树算法详解 编辑:程序博客网 时间:2024/05/25 21:32
近期在学习Android,对Activity生命周期不是特别了解,在网上看到好多关于Activity生命周期的博客,讲的都不错,看的多了,颇有感触,因此准备在这里跟大家分享下,也为了以后自己温故而知新。
下面给两个经典的Activity生命周期图便于理解:
图1
图2
Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法:
<span style="font-size:14px;">public class Activity extends ApplicationContext { protected void <strong>onCreate</strong>(Bundle savedInstanceState); protected void <strong>onStart()</strong>; protected void <strong>onRestart()</strong>; protected void <strong>onResume()</strong>; protected void <strong>onPause()</strong>; protected void <strong>onStop()</strong>; protected void <strong>onDestroy()</strong>; }</span>从图1中我们看到了两个封闭的循环,分别是:
循环1:onPause -> onResume -> onPause
循环2:onStop -> onRestart -> onStart -> onResume -> onPause -> onStop
这两个循环可以看成整个Activity生命周期的一部分,第一层循环称为焦点生命周期,第二层循环称为可视生命周期。第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity的焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。总之,Activity有如下3种生命周期:
- 整体生命周期:onCreate -> ... ... -> onDestroy。
- 可视生命周期:onStop -> ... ... -> onPause。
- 焦点生命周期:onPause -> onResume。
1.启动Activity:onCreate→onStart→onResume Activity进入运行状态。
2.Activity失去焦点:onPause→onStop。
3.Activity获得焦点:onRestart→onStart→onResume,再次进入运行状态。
4.退出Activity:onPause→onStop→OnDestory。
从以上分析中可以看出:
一个完整的Activity生命周期之间从调用的OnCreate开始,到调用onDestroy结束。
一个Activity可见的生命周期始于OnStart调用,结束于OnStop调用。在这两个方法中间,你的Actvity将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。
一个Activity活跃的生命周期始于OnResume调用,结束于OnPause调用。一个活跃的Actvity总是在前台并且接收用户输入事件。
此外,应该在onPause方法中保存当前Activity状态,这样才能保证在任何时候终止进程时都可以执行保存Activity状态的代码。
方法:
1.void onCreate(Bundle savedInstanceState)
当Activity被第首次加载时执行,Bundle类型是一个键值对集合。
2.void onStart()
activity变为在屏幕上对用户可见时调用,onCreate事件后执行。
3.void onResume()
activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的),onStart事件之后执行。
4.void onPause()
activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧,窗体被交换到后台时执行。
5. void onStop()
activity被停止并转为不可见阶段及后续的生命周期事件时调用,onPause事件之后执行。
6. void onRestart()
重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
7. void onDestroy()
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源,Activity被销毁的时候执行。
8.void onSaveInstanceState(Bundle outState)
activity被系统杀死时被调用,例如:屏幕方向改变时;Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死···主要是保存当前View组件的状态,在onPause之前被调用。
9.void onRestoreInstanceState(Bundle savedInstanceState)
activity被系统杀死后再重建时被调用,例如:屏幕方向改变时,activity被销毁再重建;当前activity处于后台,系统资源紧张将其杀死,用户又启动该activity,在onStart后被调用。
10.void onWindowFocusChanged(boolean hasFocus)
在Activity窗口获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用。
关于屏幕旋转知识:
1.指定为竖屏:在AndroidManifest.xml中对指定的Activity设置android:screenOrientation="portrait",或者在onCreate方法中指定:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
2.指定为横屏:在AndroidManifest.xml中对指定的Activity设置android:screenOrientation="landscape",或者在onCreate方法中指定:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
当屏幕旋转的时候,系统会先将当前Activity销毁,然后重建一个新的,系统先是调用onSaveInstanceState(Bundle outState)方法,这时我们可以保存一个临时参数到Bundle对象里面,
outState.putInt("param", param);
然后当Activity重建之后我们可以在onRestoreInstanceState(Bundle savedInstanceState)取出这个参数:
int param = savedInstanceState.getInt("param");
如何避免Activity的重建过程呢?我们可以在对应的<activity>配置android:configChanges="orientation",这样我们就可以在Activity中重写onConfigurationChanged(Configuration newConfig)方法:
<span style="font-size:14px;">@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(TAG, "onConfigurationChanged called."); switch (newConfig.orientation) { case Configuration.ORIENTATION_PORTRAIT: setContentView(R.layout.orientation_portrait); break; case Configuration.ORIENTATION_LANDSCAPE: setContentView(R.layout.orientation_landscape); break; } </span>这个方法是当指定了android:configChanges="orientation"后,方向改变时被调用。
这样,每次屏幕方向改变,没有了Activity的销毁重建过程,而是只有onConfigurationChanged方法被调用。
注意:如果<activity>配置了android:screenOrientation属性,则会使android:configChanges="orientation"失效。
参考文章:http://blog.csdn.net/liuhe688/article/details/6733407http://www.cnblogs.com/shaweng/archive/2012/07/03/2575302.html
http://blog.sina.com.cn/s/blog_75016706010164wb.html
- Activity 生命周期
- Activity生命周期
- Activity 生命周期
- Activity 生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- activity生命周期
- Activity 生命周期
- Activity生命周期
- Activity 生命周期
- activity生命周期
- Activity 生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- 给你无限遐想
- 让Mootools的语法结构像Jquery那样
- 终于对Google Map API v3.0有了一个全新的认识
- 從此不再談jquery,马上忘掉他开始学Mootools
- 数据库中的三范式
- Activity生命周期
- jQuery Sizzle
- 全球前 40 名的网站用的是什么编程语言
- 关于Jquery内存的释放
- 一个单引号引发的MYSQL性能损失
- 剛建立了一个QQ群用来讨论Mootools
- 素数知识——HDU 4196
- 解决Firefox的Sync不能同步的问题
- 如何删除cookie