Activity的生命周期

Activity从创建到销毁,在整个的生命周期中的不同阶段调用7个生命周期方法,所有回调方法都可以重写,使得在 Activity 状态发生变化时执行相应操作。 以下框架 Activity 包括每一个基本生命周期方法:

public class ExampleActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // The activity is being created.

    }

    @Override

    protected void onStart() {

        super.onStart();

        // The activity is about to become visible.

    }

    @Override

    protected void onResume() {

        super.onResume();

        // The activity has become visible (it is now "resumed").

    }

    @Override

    protected void onPause() {

        super.onPause();

        // Another activity is taking focus (this activity is about to be "paused").

    }

    @Override

    protected void onStop() {

        super.onStop();

        // The activity is no longer visible (it is now "stopped")

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        // The activity is about to be destroyed.

    }

}

下图说明了Activity在状态转变期间可能经过的路径。矩形表示回调方法。

从图中,我可以看到Activity 生命周期中的有三个嵌套循环:

  1. Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),在onDestroy() 中的释放所有其余资源。例如,如果Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。
  2. Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
  3. Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台,例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

下面详细描述每个回调的方法。

1、onCreate

首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态(请参阅后文的保存 Activity 状态)。

始终后接 onStart()。

2、onRestart()

在 Activity 已停止并即将再次启动前调用。

始终后接 onStart()

3、onStart

在 Activity 即将对用户可见之前调用。

如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。

4、onResume

在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。

始终后接 onPause()。

5、onPause()

当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。

如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。

当其他高优先级的应用需要内存时,可能会到导致onPause终止App的进程

6、onStop()  

在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。

如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()。

7、onDestroy()    

在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。

当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。

下面给出上述触发上述事件的常见时机。

  1. 启动 Activity,依次触发onCreate()--->onStart()--->onResume()这三个方法;
  2. 启动Activity后,点击返回键,依次触发onPause()--->onStop()--->onDestory()这三个方法;
  3. 启动Activity后,点击Home键,依次触发onPause()--->onStop()这两个方法;
  4. 启动Activity后,旋转屏幕,依次触发onPause()--->onStop()--->onDestory()-->onCreate()--->onStart()--->onResume(),这六个方法。
  5. 在Activity1中启动Activity2,依次触发Activity1的onPause()--->onStop()这两个方法,触发Activiy2的onCreate()--->onStart()--->onResume(),
  6. 点击返回键,从Activity2返回到Activity1,依次触发Activity2的onPause()--->onStop()--->onDestory()这三个方法,触发Activity1的onRestart()--->onStart()--->onResume();

注意的是,当我们通过最近使用的应用列表关闭APP时,onDestroy的执行表现出非常的不确定性,通常Activity栈里面只有一个Activity时,不会触发onDestory,如果有多个Activity,只会触发第一个Acitivy的onDestory,关于Activity栈的后面会有介绍,请大家在实际操作中注意。

onPause()、onStop() 和 onDestroy()这三个方法返回都有可能随时终止承载 Activity 的进程。 onPause() 是这三个方法中的第一个,因此 Activity 创建后,onPause() 必定成为最后调用的方法,然后才能终止进程( 如果系统在紧急情况下必须恢复内存,则可能不会调用 onStop() 和 onDestroy())。因此,您应该使用 onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。不过,您应该对 onPause() 调用期间必须保留的信息有所选择,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。

(张伟:2018年10月27日)

(转载时请注明来源)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值