首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Android】Activity生命周期

【Android】Activity生命周期

作者头像
三三是该溜子
发布2025-08-23 08:23:33
发布2025-08-23 08:23:33
4520
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏

一:生命周期图

非常核心和重要的图,刻在脑子里

Resume [rɪˈzjuːm] (中断后)重新开始

二:核心阶段与对应回调

Activity 从创建到销毁,历经 “初始化→可见→可交互→部分可见→不可见→销毁” 过程,对应 6 个核心回调:

  • onCreate:Activity 首次创建,做初始化(如布局加载、变量初始化),仅调用 1 次。
  • onStart:Activity 进入 “可见但未交互” 状态,UI 开始显示。
  • onResume:Activity 进入 “前台可交互” 状态,此时可响应用户操作。
  • onPause:Activity 失去焦点(如被弹窗遮挡),需暂停动画、保存临时数据。
  • onStop:Activity 完全不可见,可释放非必要资源(如停止后台线程)。
  • onDestroy:Activity 销毁前最后一步,释放所有资源(如关闭数据库、注销监听 )。

1:onPause 状态

当一个 Activity 失去焦点时,系统会调用它的 onPause 方法。此时 Activity 只是部分被遮挡,比如出现一个对话框覆盖在当前 Activity 部分区域 ,或者启动了一个透明主题的 Activity 覆盖在当前 Activity 之上,这种情况下当前 Activity 仍然是部分可见的。

(1)恢复到onResume状态

应用从「部分可见」或「暂时被打断」的状态回到了「前台可见且可交互」的状态

  • 系统弹窗(如权限请求、通知栏下拉)关闭后
(2)到Stop状态

意味着应用从「部分可见」进一步变为「完全不可见」,但尚未被销毁。

  • 启动一个新的全屏 Activity(完全覆盖当前 Activity)。
  • 用户按下 Home 键,应用退到后台(桌面完全覆盖应用)。
  • 屏幕关闭(设备进入休眠状态)。
  • 系统因内存不足,暂时将后台 Activity 置于停止状态(但未销毁)。

2:onStop 状态

只有当 Activity 完全不可见时,系统才会调用其 onStop 方法。常见的触发场景包括:

  • 新 Activity 启动:当启动一个非透明主题的 Activity 时,原 Activity 会被完全遮挡,从而进入 onStop 状态。
  • Activity 切换:比如从当前 Activity 切换到另一个 Activity,原 Activity 不再显示在屏幕上。
  • 用户返回主屏幕:当用户按下 Home 键,当前 Activity 被系统切换到后台,变得完全不可见,也会进入 onStop 状态
(1) onRestart() 的转换

触发场景:用户回到已停止的 Activity

  • 按返回键、切换应用后切回
  • 打开 Activity A → 启动 Activity BA 进入 onStop()) → 按返回键回到 AA 执行 onRestart() → onStart() → onResume()
(2)到**App process killed** 的转换

触发场景:系统因内存不足强制销毁 Activity 进程

总结:两种箭头的核心区别

转换路径

触发条件

后续恢复流程

数据保留情况

onStop() → onRestart()

用户主动切回(未被系统销毁)

onRestart() → onStart() → onResume()

数据 / 状态可保留(未销毁)

onStop() → App process killed

系统因内存不足强制回收

下次启动需重新 onCreate()

数据需依赖 onSaveInstanceState() 恢复

(3)到onDestroy

释放所有Activity所有资源

3:小结

Activity 生命周期分的这么细,就是方便我们开发者在不同阶段精准控制 Activity 行为,通过覆盖这些方法,能清晰把控页面从生到死的每一步,解决初始化、资源管理、状态恢复等核心问题 。

三:logcat观察生命周期的变化

看一下跳转页面生命周期发生了怎样的变化

设置点击事件,重写周期方法,打印日志;

代码语言:javascript
复制
public class LifeCycleActivity extends AppCompatActivity {
    private static final String TAG = "LifeCycleActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);

        Log.i(TAG, "onCreate: " + TAG + "已创建");
        findViewById(R.id.tv_label).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(LifeCycleActivity.this ,SecondLifeActivity.class);
                startActivity(intent);
            }
        });

    }

    /**
     * 已开始:Activity会进入到前台
     */
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, TAG + " onStart: 已开始");
    }

    /**
     * 已恢复:可以和用户进行交互
     */
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, TAG + " onResume: 已恢复");
    }

    /**
     * 已暂停:不是被销毁,只是暂时离开Activity
     */
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, TAG + " onPause: 已暂停");
    }

    /**
     * 已停止:Activity页面不会被附加到窗口管理当中,但是Activity本身的一些成员变量、状态还会存在
     */
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, TAG + " onStop: 已停止");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, TAG + " onRestart: 准备重新触发onStart");
    }

    /**
     * Activity被销毁之前,会调用这个方法
     */
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.i(TAG, TAG + " onDestroy: 准备销毁当前页面!");
    }
}

布局

代码语言:javascript
复制
public class SecondLifeActivity extends AppCompatActivity {
    private static final String TAG = "SecondLifeActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second_life);
        Log.i(TAG, TAG + " SecondLifeActivity onCreate: 已经创建");

    }
    /**
     * 已开始:Activity会进入到前台
     */
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, TAG + " onStart: 已开始");
    }

    /**
     * 已恢复:可以和用户进行交互
     */
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, TAG + " onResume: 已恢复");
    }

    /**
     * 已暂停:不是被销毁,只是暂时离开Activity
     */
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, TAG + " onPause: 已暂停");
    }

    /**
     * 已停止:Activity页面不会被附加到窗口管理当中,但是Activity本身的一些成员变量、状态还会存在
     */
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, TAG + " onStop: 已停止");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, TAG + " onRestart: 准备重新触发onStart");
    }

    /**
     * Activity被销毁之前,会调用这个方法
     */
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.i(TAG, TAG + " onDestroy: 准备销毁当前页面!");
    }
}

布局如下

结果如下

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:生命周期图
  • 二:核心阶段与对应回调
    • 1:onPause 状态
      • (1)恢复到onResume状态
      • (2)到Stop状态
    • 2:onStop 状态
      • (1)到 onRestart() 的转换
      • (2)到**App process killed** 的转换
      • 总结:两种箭头的核心区别
      • (3)到onDestroy
    • 3:小结
  • 三:logcat观察生命周期的变化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档