Activity 生命周期概念

为了在 Activity 生命周期的各个阶段之间导航转换,Activity 类提供六个核心回调:onCreate()onStart()

onResume()onPause()onStop()onDestroy()。当 Activity 进入新状态时,系统会调用每个回调。

onCreate()

您必须实现此回调,其在系统首次创建 Activity 时触发。Activity 会在创建后进入已创建状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在Activity 的整个生命周期中应只发生一次。

onStart()

当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持交互做准备。例如,应用通过此方法来初始化维护界面的代码。

当 Activity 进入已开始状态时,与 Activity 生命周期相关联的所有具有生命周期感知能力的组件都将收到 ON_START 事件。

onStart() 方法会非常快速地完成,并且与“已创建”状态一样,Activity 不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入已恢复状态,系统将调用 onResume() 方法。

onResume()

Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户交互的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。当发生中断事件时,Activity 进入已暂停状态,系统调用 onPause() 回调。

onPause()

系统将此方法视为用户正在离开您的 Activity 的第一个标志(尽管这并不总是意味着活动正在遭到销毁);此方法表示 Activity 不再位于前台(尽管如果用户处于多窗口模式,Activity 仍然可见)。使用 onPause()方法暂停或调整当 Activity处于“已暂停”状态时不应继续(或应有节制地继续)的操作,以及您希望很快恢复的操作。Activity 进入此状态有多个原因,例如:

  • onResume() 部分所述,某个事件会中断应用执行。这是最常见的情况。
  • 在 Android 7.0(API 级别 24)或更高版本中,有多个应用在多窗口模式下运行。无论何时,都只有一个应用(窗口)可以拥有焦点,因此系统会暂停所有其他应用。
  • 有新的半透明 Activity(例如对话框)处于开启状态。只要 Activity 仍然部分可见但并未处于焦点之中,它便会一直暂停。

当 Activity 进入已暂停状态时,与 Activity 生命周期相关联的所有具有生命周期感知能力的组件都将收到 ON_PAUSE 事件。这时,生命周期组件可以停止任何无需在组件未在前台时运行的功能,例如停止摄像头预览。

onPause() 执行非常简单,而且不一定要有足够的时间来执行保存操作。因此,您应使用 onPause() 来保存应用或用户数据、进行网络调用,或执行数据库事务。因为在该方法完成之前,此类工作可能无法完成。相反,您应在 onStop() 期间执行高负载的关闭操作。如需详细了解在 onStop() 期间执行的合适操作,请参阅 onStop()。如需了解有关保存数据的更多信息,请参阅保存和恢复 Activity 状态

完成 onPause() 方法并不意味着 Activity 离开“已暂停”状态。相反,Activity 会保持此状态,直到其恢复或变成对用户完全不可见。如果 Activity 恢复,系统将再次调用 onResume() 回调。如果 Activity 从“已暂停”状态返回“已恢复”状态,则系统会让 Activity 实例继续驻留在内存中,并会在系统调用 onResume() 时重新调用该实例。在这种情况下,您无需重新初始化在回调方法导致 Activity 进入“已恢复”状态期间创建的组件。如果 Activity 变为完全不可见,则系统会调用 onStop()。下一部分将介绍 onStop() 回调。

onStop()

如果您的 Activity 不再对用户可见,则说明其已进入已停止状态,因此系统将调用 onStop() 回调。举例而言,如果新启动的 Activity 覆盖整个屏幕,就可能会发生这种情况。如果系统已结束运行并即将终止,系统还可以调用 onStop()

当 Activity 进入已停止状态时,与 Activity 生命周期相关联的所有具有生命周期感知能力的组件都将收到 ON_STOP 事件。这时,生命周期组件可以停止任何无需在组件未在屏幕上可见时运行的功能。

onStop() 方法中,应用应释放或调整应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从细粒度位置更新切换到粗粒度位置更新。使用 onStop() 而非 onPause() 可确保与界面相关的工作继续进行,即使用户在多窗口模式下查看您的 Activity 也能如此。

您还应该使用 onStop() 执行 CPU 相对密集的关闭操作。例如,如果您无法找到更合适的时机来将信息保存到数据库,则可在 onStop() 期间执行此操作。

进入“已停止”状态后,Activity 要么返回与用户交互,要么结束运行并消失。如果 Activity 返回,系统将调用 onRestart() 方法。如果 Activity 结束运行,系统将调用 onDestroy()

onDestroy()

销毁 Ativity 之前,系统会先调用 onDestroy())。系统调用此回调的原因如下:

  1. Activity 正在结束(由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish())),或者
  2. 由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity

当 Activity 进入已销毁状态时,与 Activity 生命周期相关联的所有具有生命周期感知能力的组件都将收到 ON_DESTROY 事件。此时,生命周期组件可以在 Activity 遭到销毁之前清理所需的任何数据。

package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    String TAG = "myTag";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate: "); // 创建(销毁后)

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: "); // 开始(从桌面点击 app)
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: "); // 准备显示 (从桌面点击 app)
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: "); //暂停(返回桌面触发)
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: "); // 停止(返回桌面触发)
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart: "); //重新开始(从桌面点击 app)
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: "); // 后台销毁的时候执行,屏幕翻转也会销毁然后重新创建 Activity
    }
}

生命周期模拟

APP 启动:onCreate > onStart > onResume 进入”已恢复”状态

HOME 返回桌面:onPause(暂停)> onStop 进入已停止状态(失去焦点的时候)

返回桌面后点击 APP:onRestart > onStart > onResume

杀死 Ativity:onPause > onStop > onDestroy

屏幕翻转: onPause > onStop > onDestroy > onCreate > onStart > onResume

ps:屏幕翻转的时候,系统也会将 Ativity 杀掉 然后重新创建 Ativity

总结

以上只是大致了解 Ativity 的生命周期,并不能囊括整个 Ativity 生命周期


随知修行乃当务之急,然怠惰度日至今。