Activity生命周期详解

关于Activity

在Android应用程序里,一个Activity就是一个用户界面。用户与程序的交互就是通过Activity来实现的,可以看成网站的页面。主Activity是程序启动的入口。应用程序成功启动之后,呈献给用户的第一个界面,即为该程序的主Activity。

Activity的四种状态

Android 的虚拟机(VM)是使用基于栈(Stack based) 管理,主要有四种状态:

Active (运行状态):
使用者启动应用程序或Activity 后,Activity 运行中的状态,可与用户之间进行交互,此时当前Activity位于栈顶。
需要注意的是,在Android 平台上,同一个时刻只会有一个Activity 处于活动(Active)或运行(Running)状态。其他的Activity 都处于未启动(Dead)、停止(Stopped)、或是暂停(Pause)的状态。

Paused (暂停状态)
当Activity 暂时暗下来,退到背景画面的状态。
当使用Toast、AlertDialog或电话呼入时,都会让原本运行的Activity 退到背景画面。新出现的Toast、AlertDialog 等界面元件盖住了原来的Activity 画面。Activity 处在”Paused”状态时,使用者无法与原Activity 互动。

Stopped (停止状态)
Activity完全被另一个Activity所覆盖,则其状态为Stopped。
有其他Activity 正在执行,而当前Activity 已经离开屏幕,不再动作的状态。通过长按”Home”钮,可以叫出所有处于”Stopped”状态的应用程序列表。在“Stopped”状态的Activity,还可以通过“Notification”来唤醒。

Dead (销毁状态)
Activity 尚未被启动、已经被手动终止,或已经被系统回收的状态。
要手动终止Activity,可以在程序中调用“finish”函数,若是被系统回收,可能是因为内存不足,因此系统根据内存不足时的回收规则,将处于“Stopped”状态的Activity 所占用的内存回收。

Activity的生命周期

每个活动(Activity)都处于某个状态。对于开发者来说,是无法控制其应用程序处于某个状态的,这些均由系统来完成。但当一个活动状态发生改变的时,开发者可以通过调用onXXX()方法,获取相关的通知信息。

完整的Activity 生命周期由”Create”状态开始,由”Destroy”状态结束。建立
(Create)时分配资源,销毁(Destroy)时释放资源。

Activity生命周期流程图

  • onCreate : 当活动第一次启动时触发该方法。该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。
  • onStart : 此方法被回调时表示Activity正在启动,所属活动将被展现给用户,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。
  • onResume : 当一个活动和用户发生交互的时候,触发该方法。当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。
  • onPause : 当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。
  • onStop : 当一个活动不再需要展示给用户的时候,触发该方法。一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。如果内存紧张,系统会直接结束这个活动,而不会触发onStop 方法,所以保存状态信息是应该在onPause时做,而不是onStop时做。
  • onRestart : 当处于停止状态的活动需要再次展现给用户的时候,触发该方法,表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。
  • onDestroy :当一个活动不再需要展示给用户的时候,触发该方法。此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

以上关于各个阶段的状态详细说明大部分来自于Android之Activity生命周期浅析(一),并在其基础上做了一些小小的补充。

以上7个方法中除了onRestart()方法,其他的都是两两相对的,从而又可以将活动分为3个生存期。

完整生命期:活动在onCreate()方法到onDestory()方法之间经历的时期。

第一次启动Activity:依次执行以下方法:onCreate() -> MainActivity created -> onStart() -> MainActivity started -> onResume() -> MainActivity actived,进入活动状态。

结束Activity:依次执行以下方法:onPause () -> MainActivity paused -> onStop () -> MainActivity stoped -> onDestory() -> MainActivity killed。

  • Activity由活动状态转为暂停状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见。但已失去了焦点,故不可与用户交互。在极特殊的情况下,Android将会杀死一个暂停的Activity,来为活动的Activity提供充足的资源;
  • Activity被停止,变为完全隐藏,失去焦点,并且不可见。但是系统将仍在内存中保存它所有的状态和信息;
  • Activity被杀死,转为销毁状态。Activity结束,退出当前应用程序。

可见生存期:活动在onStart()方法到onStop()方法之间经历的时期。
当Activity 运行到“Start”状态时,就可以在屏幕上看到该Activity。相反当Activity 运行到“Stop”状态时,此Activity 就会从屏幕上消失。当使用者按下Back 按钮回到上一个Activity 时,会先到Restart 状态,再到一般的Start 状态。

前台生存期:活动在onResume()方法到onPause()方法之间经历的时期。
使用者能否直接存取屏幕(Resume/Pause),当有个Toast、AlertDialog、短信、电话等信息发生时,原来的Activity 会处于“Pause”状态,暂时放弃直接存取屏幕的能力,被中断到背景去,将前景交给优先级高的事件。当这些优先级高的事件处理完后,Activity 就改进入”Resume”状态,此时又直接存取屏幕。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值