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种生命周期:

  1. 整体生命周期:onCreate -> ... ... -> onDestroy。
  2. 可视生命周期:onStop -> ... ... -> onPause。
  3. 焦点生命周期:onPause -> onResume。
Activity生命周期几个过程:

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处于后台,系统资源紧张将其杀死,用户又启动该activityonStart被调用。

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/6733407

http://www.cnblogs.com/shaweng/archive/2012/07/03/2575302.html

http://blog.sina.com.cn/s/blog_75016706010164wb.html



0 0
原创粉丝点击