美文网首页
Activity生命周期与启动模式

Activity生命周期与启动模式

作者: Android天之骄子 | 来源:发表于2017-12-03 14:34 被阅读0次

    典型情况下的生命周期

    在正常情况下,Activity会经历如下生命周期。如图


    activity_lifecycle.png
    • onCreate():表示Activity正在被创建,这是声明周期的第一个方法。在这个方法中可做一些初始化工作。
    • onRestart():表示Activity重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart()就会被调用,这种情况是用户行为所导致的,比如用户按Home键切换到桌面或者打开一个新的Activity,这是当前Activity就会暂停,也就是onPauseonStop会执行,接着用户又回到了这个ActivityonRestart()就会执行。
    • onStart():表示Activity在启动,这是Activity已经可见了,但是还没有出现在前台,还无法和用户交互。
    • onResume():表示Activity已经可见,并出现在前台可以进行交互,onRestartonResume都表示可见,但onStartActivity还在后台,onResumeActivity在前台,可以交互。
    • onPause():表示Activity处于暂停状态,不能和用户交互,当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容。
    • onStop():表示Activity处于停止状态,已经不可见,如果 Activity即将被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
    • onDetory():表示Activity即将被销毁,可以做一些回收工作和资源的释放。

    注意:如果系统在紧急情况下必须回收内存,则可能不会调用onStop()onDestroy(),因此,应该在onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。但是不能太耗时,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。


    特定情况下Activity生命周期

    • 情况一:创建一个Activity,重写生命周期的各个方法,观察各个方法的执行顺序。(先启动一个界面,然后,按返回键)onCreate-->onStar-->onResume-->onPause-->onStop-->onDestroy

    • 情况二:启动一个界面,按home键,然后,重新启动该界面,再按返回键。
      ①启动一个界面,按homeonCreate-->onStart-->onResume-->onPause-->onStop
      ②重新启动该界面,onRestart-->onStart-->onResume
      ③按返回键,onPause-->onStop-->onDestroy

    • 情况三:启动一个界面,在该界面上点击按钮,启动下一个界面,然后,按返回键,再按返回键。
      ①启动一个界面,在该界面上点击按钮,启动下一个界面
      main onCreate-->main onStart-->main onResume-->main onPause-->Second onCreate-->Second onStart-->Second onResume-->main onStop
      ②按返回键
      Second onPause-->main onRestart-->main onStart-->main onResume-->Second onStop--> Second onDestroy
      ③再按返回键
      main onPause-->main onStop-->main onDestroy

    • 情况四:启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面),然后,按返回键,再按返回键。
      ①启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面)
      main onCreate-->main onStart-->main onResume-->main onPause-->Second onCreate-->Second onStart-->Second onResume
      ②按返回键
      Second onPause-->main onResume--> Second onStop--> Second onDestroy
      ③再按返回键
      main onPause-->main onStop-->main onDestroy


    保存 Activity 状态

    当系统配置发生改变或优先级高的应用需要内存时,Activity有可能会被销毁,其中onPauseonStoponDestory会被调用,或异常情况下系统会先调用 onSaveInstanceState(),然后再使 Activity销毁。系统会向该方法传递一个Bundle,可以在其中使用putString()putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止应用进程,并且用户返回Activity,则系统会重建该 Activity,并将Bundle 同时传递给onCreate()onRestoreInstanceState()。可以使用上述任一方法从Bundle 提取保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

    restore_instance.png

    注意:无法保证系统会在销毁Activity 前调用onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开Activity 时,因为用户的行为是在显式关闭 Activity)。如果系统调用 onSaveInstanceState(),它会在调用onStop() 之前,并且可能会在调用onPause() 之前进行调用,(顺序不一定)

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


    系统配置发生改变后的生命周期

    当系统配置发生改变后,Activity实例可以重新创建,也可以不重新创建,如果不想重新创建,可以在清单文件<activity>标签下设置android:configChanges属性,比如不想屏幕方向改变后重新创建,那么就设置android:configChanges="orientation",该属性声明配置将阻止 Activity 重新启动。 Activity 反而会保持运行状态,并且系统会调用其onConfigurationChanged()方法。其中常用的属性有

    • orientation屏幕方向发生了变化 — 用户旋转了设备。
    • screenSize当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。
    • keyboardHidden键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。

    相关文章

      网友评论

          本文标题:Activity生命周期与启动模式

          本文链接:https://www.haomeiwen.com/subject/uganbxtx.html