永无止步_简单介绍Activity的生命周期

来源:互联网 发布:网络推广外包协议 编辑:程序博客网 时间:2024/05/29 06:53

      Activity作为Android的四大组件之一,非常的重要,也是最常用的四大组件,使用Activity必须要在AndroidManifest中进行注册,那么作为Android的基础,Activity的生命周期你是否完全掌握了呢?下面就让我们来一起回顾一下Activity的生命周期吧!

       首先,你需要知道 Activity的生命周期分为两种。第一种典型情况下的生命周期(就是我们开发中经常用到的)以及第二种 异常情况下的生命周期(虽说开发中也会用到,但是并不是所有的项目都会去(需要)回调异常生命周期的方法),所以我们先来介绍前者,因为后者出现的情况比较特殊。

第一种:典型情况下的生命周期:(PS:官网的流程图肯定是要看的,一张图包含了一个Activity从创建到销毁所经历的一切)

                                                      

        可以清晰地看到,Avtivity的整个生命周期是发生在 onCreate() 和 onDestroy()之间的。其中可见生命周期是发生onStart() 和 onStop()之间的,也就是用户可以在界面看到Activity并且可以交互的状态。前台生命周期是发生在onResume()onPause() 之间的,这个状态下Activity位于所有的Activity之上,并且可以和用户交互。

想要彻底灵活运用Activity的生命周期,那么这七个回调方法,是一定要搞懂的你需要知道每个方法都可以做一些什么事)

        1. onCreate():首次创建 Activity 时调用。 可以在此方法中执行所有正常的静态设置 ,比如:创建视图、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态,而后会调用onStart()。

        2. onRestart():在Activity被停止后再次启动时调用(即屏幕熄灭后再次回到app,按下home键后再次回到app),而后会调用onStart()。

        3. onStart():在 Activity 即将对用户可见之前调用。而后会如果Activity转入了前台就会调用onResume()。 如果此时直接屏幕熄灭或者用户按下home键则会直接调用onStop(),当然这种情况比较极端。

        4. onResume():在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。而后会调用onPause()。

        5. onPause():系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行,所以不能执行耗时操作。而后正常情况下会调用onStop()。但是有一种极端情况,就是如果这个时候快速让 当前Activity 返回前台,则会调用 onResume()

        6. onStop():在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就会调用此方法。而后如果 Activity 恢复与用户的交互,则会调用 onRestart(),如果 Activity 被销毁,则会调用onDestroy()

        7. onDestroy():在 Activity 被销毁前调用,这是 Activity 收到的最后调用。 当 Activity 结束(对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 你可以通过 isFinishing() 方法区分这两种情形。

注意:因为如果跳转下一个Activity时系统会先调用上一个Activity的onPause()方法,所以一定不能在onPause()方法中进行耗时操作。


第二种:异常情况下的生命周期:(PS:Activity被系统回收或者当前设备的配置发生了变化“例如横屏”,从而导致Activity被销毁重建)我们一样先来看一张官网的流程图

                                          

        可以看到,在两种情况下,(从Activity running开始走)Activity 重获用户焦点时可保持状态完好:1.系统在销毁 Activity 后重建 Activity,Activity 必须恢复之前保存的状态;2.系统停止 Activity 后继续执行 Activity,并且 Activity 状态保持完好。

        当 Activity 暂停或停止时(用户按下hoem键或者屏幕熄灭),Activity 的状态会得到保留。 确实如此,因为当 Activity 暂停或停止时,Activity 对象仍保留在内存中 ,有关其成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(当它“继续”)时,这些更改仍然存在。

       不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,你可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:onSaveInstanceState()方法。

        系统会先调用 onSaveInstanceState(),然后销毁 Activity。系统会向该方法传递一个 Bundle,你可以在其中使用 putString()  putInt() 等方法以键-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

        不过,即使您什么都不做,也不实现 onSaveInstanceState()Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id 属性)。如果小部件没有 ID,则系统无法保存其状态。注意:默认情况下系统不会恢复储存成员值(变量)!

备注:你只需旋转设备,让屏幕方向发生变化,就能有效地测试您的应用的状态恢复能力。 当屏幕方向变化时,系统会销毁并重建 Activity,以便应用可供新屏幕配置使用的备用资源。

注意:onSaveInstanceState()的调用时序在onStop() 之前,但是和onPause() 的调用时序就不一定了,有可能在onPause() 之前或者之后。又因为无法保证系统会调用 onSaveInstanceState()(存在不需要保存状态的情况,例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity),因此您只应利用它来记录 Activity 的瞬态(UI 的状态)切勿使用它来存储持久性数据,而应使用 onPause() 在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)!

最后想说,生命周期只有自己体验一遍,印象才会深刻,所以给出下面代码,直接复制粘贴,就可以进行测试。

    private final String TAG = "TEST";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Log.d(TAG,"onCreate ---> 创建时调用");    }    @Override    protected void onRestart() {        super.onRestart();        Log.d(TAG,"onRestart ---> 重启时调用");    }    @Override    protected void onStart() {        super.onStart();        Log.d(TAG,"onStart ---> 即将可见不可交互时调用");    }    @Override    protected void onResume() {        super.onResume();        Log.d(TAG,"onResume ---> 可见可交互时调用");    }    @Override    protected void onPause() {        super.onPause();        Log.d(TAG,"onPause ---> 即将暂停时调用");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG,"onStop ---> 即将停止不可见时调用");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG,"onDestroy ---> 即将销毁时调用");    }    @Override    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {        super.onSaveInstanceState(outState, outPersistentState);        Log.d(TAG,"onSaveInstanceState ---> 异常销毁时调用");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        Log.d(TAG,"onRestoreInstanceState ---> 恢复数据时调用");    }

附:技术交流QQ群:653123508 ,欢迎大家进群一起解决问题,提升技术。



原创粉丝点击