盒子
盒子
文章目录
  1. Activity生命周期
    1. 返回栈
    2. 生命周期
    3. 异常情况下的生命周期
      1. 屏幕旋转
  2. Activity的启动模式
  3. standard
  4. singleTop
  5. singleTask
  6. singleInstance

Activity的生命周期和启动模式

Activity生命周期

返回栈

Activity与返回栈

  1. 运行状态:位于返回栈栈顶
  2. 暂停状态:不在栈顶但仍然可见,例如对话框的出现
  3. 停止状态:不在栈顶且完全不可见,但系统仍保留该活动的成员变量和相应的状态
  4. 销毁状态:被移除返回栈

生命周期

Activity的生命周期

  • onCreate
  • 在活动第一次被创建时调用。

  • onStart
  • 在活动由不可见到可见时调用。

  • onResume
  • 在活动准备与用户进行交互时调用,此时活动必须位于栈顶并且处于运行状态

  • onPause
  • 在该Activity失去焦点未被完全覆盖,系统准备去启动或恢复另一个活动时调用,通常会在该方法中释放一些消耗CPU的资源,以及保存一些重要数据。

  • onStop
  • 在活动完全不可见时调用。不同于onPause的是若新活动是以对话框的形式启动的那么该活动只会执行onPause方法。

  • onDestroy
  • 在活动被销毁之前调用。

  • onRestart
  • 在活动由停止状态变为运行状态之前调用。

    需要特别注意的是:

    当从activity1跳转到另一个activity2时,会先执行activity1的onPause方法,再执行activity2的onResume方法

    以上七种又可归纳为:

    完整生存期:onCreate()onDestroy()之间

    可见生存期:onStart()onStop()之间

    前台生存期:onResume()onPause()之间

    防止活动被回收导致信息丢失:

    一个活动若处于停止即onPause状态是有可能被系统回收的。

    但当系统回收活动时会调用 onSaveInstanceState(Bundle) 回调方法。

    该方法提供一个Bundle类型参数,可通过Bundle保存数据。

    然后在其它活动的onCreate方法中的Bundle类将它取出来。

    异常情况下的生命周期

    异常情况下Activity的重建过程

    onSavaInstanceState会在onStop被调用前调用,但可在onPause被调用前调用也可以在onPause被调用后调用,同时用户主动销毁不会调用,例如当用户点击回退键或者调用了 finish() 方法, 不会调用该方法。

    在Activity被重建时系统会调用onRestoreInstanceState(在onStart后,在onResum前),并且onSavaInstanceState会把保存了数据的Bundle分别传给onCreateonRestoreInstanceState

    屏幕旋转

    屏幕旋转会导致Activity异常情况下重建Activity

    1
    2
    3
    4
    //切屏会重新调用各个生命周期,切横竖屏只会执行一次
    android:configChanges=“orientation”
    //切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
    android:configChanges=“orientation|keyboardHidden”

    创建layout-land文件夹,在此文件夹中新建test-land.xml,则若屏幕旋转为横屏时便会自动载入test-land.xml中的布局内容

    注意

    onSavaInstanceState只有在activity异常销毁时才会被调用。

    Activity的启动模式

  • launchMode
  • 1
    2
    3
    4
    5
    6
    <activity android:name=".MainActivity" android:launchMode="standard">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    standard

    标准模式,是系统的默认模式。每次启动一个Activity都会新创建一个实例,不论该实例原先是否存在

    该模式规定如果A启动了B,则B会进入到A所在的栈中,因此当B不存在任务栈的C启动后,后报错,解决方法为:

    1
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

    singleTop

    栈顶复用模式,此模式规定当新Activity已存在任务栈的栈顶则不会创建新的实例

    此时方法onNewIntent方法会被调用,但onCreate和onStart方法不会被调用

    singleTask

    栈内复用模式,是一种单实例模式,该模式规定只要任务栈中存在该Activity就不会创建新实例

    当任务栈中不存在该Activity,则创建一个Activity实例并放入到任务栈栈顶。如果存在,则将该Activity移到栈顶,并调用onNewIntent方法

    singleInstance

    单实例模式,拥有singleTask的所有特性,但每一个Activity都在单独存在于一个栈。

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫