Activity生命周期详解

Android应用组件Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件。对于一个Android应用程序来说,可以包含一个或多个Activity,一般在程序启动后会呈现一个Activity,用于提示用户程序已经正常启动。当它不积极运行时,Activity可以被操作系统终止以节省内存。

 

Activity表现为4种状态,分别是活动状态、暂停状态、停止状态和非活动状态。

●  活动状态,Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
●  暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互;或者屏幕被锁定。
●  停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡。
●  非活动状态,不在以上3种状态中的Activity则处于非活动状态。

 

这四种状态是可以相互转换的,转换关系图如下图所示。



 

Android调用以下的事件回调方法通知Activity从某一状态转变到另一状态。

 

复制代码
public class MyActivity extends Activity {
        protected void onCreate(Bundle savedInstanceState);
        protected void onStart();
        protected void onRestart();
        protected void onResume();
        protected void onPause();
        protected void onStop();
        protected void onDestroy();
    }
复制代码

 

 


 Activity生命周期的事件回调方法,如下表:

 

方法 是否可终止 说明
onCreate() Activity启动后第一个被调用的方法,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等
onStart() 当Activity显示在屏幕上时,该方法被调用
onRestart() 当Activity从停止状态进入活动状态前,调用该方法
onResume() 当Activity能够与用户交互,接收用户输入时,该方法被调用。此时的Activity位于Activity栈的栈顶
方法 是否可终止 说明
onPause() 当Activity进入暂停状态时,该方法被调用。一般用来保存持久的数据或释放占用的资源
onStop() 当Activity进入停止状态时,该方法被调用
onDestroy() 在Activity被终止前,即进入非活动状态前,该方法被调用
onSaveInstanceState() Android系统因资源不足终止Activity前调用该方法,用以保存Activity的状态信息,供onRestoreInstanceState()或onCreate()恢复之用
onRestoreInstanceState() 恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume ()之间被调用

 

Activity事件回调方法的调用顺序,如下图所示:

全生命周期:从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。

可视生命周期:从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。

活动生命周期:从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。


Situation1

正常启动: onCreate()  →   onStart()  →  onResume();

返回健退出: onPause()  →   onStop()  →   onDestory();

 

Situation2:

正常启动 : onCreate()  →   onStart   →  () onResume();

按home健: onPause()  →   onStop();

正常启动:onRestart()  →   onStart()   →  onResume();

 

Situation3:

正常启动:onCreate()   →   onStart()   →   onResume();

横竖屏切换: onPause()  →   onStop()   →  onDestory()   →   onCreate()   →  onStart()  →   onResume();

 

Situation4:

前提条件:Activity的AndroidManifest.xml中设置android:configChanges="orientation|keyboardHidden|screenSize”

正常启动:onCreate()   →   onStart()   →  onResume();

横竖屏切换: onConfigurationChanged();

 

结论:

设置Activity的android:configChanges="orientation |keyboardHidden|screenSize"时,切 屏不会重新调用各个生命周期,只会执 行onConfigurationChanged方法;

自从Android3.2(API13), 在设置Activity的 android:configChanges="orientation |keyboardHidden"后,还是一样会重新 调用各个生命周期的。因为screensize 也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的 MiniSdkVersion和TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了 设置"orientation",你还必须设 置"ScreenSize"。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值