Android里面的Activity生命周期特殊调用进阶思考

在 Android 中,当 Activity 的 onCreate 方法中调用 finish() 时,其生命周期会直接跳转至 onDestroy,而不会触发 onStart 和 onResume。具体流程如下:  

生命周期流程

1. onCreate()

系统初始化 Activity,开发者在此设置布局和初始化逻辑。当调用 finish() 后,Activity 被标记为 mFinished = true。

 2. onDestroy()

Activity 被销毁,释放资源。系统跳过中间状态(onStart、onResume、onPause、onStop),直接触发 onDestroy。 

源码分析

 1. finish() 的调用与标记 •  调用 finish() 会设置 Activity 的 mFinished 标志位,并通知 ActivityManagerService(AMS)销毁该 Activity。 

// Activity.javapublic void finish() {    if (mParent == null) {        ActivityManager.getService().finishActivity(mToken, resultCode, resultData, finishTask);    } else {        mParent.finishFromChild(this);    }    mFinished = true; // 标记为已结束}

    2. ActivityThread 处理流程 在启动 Activity 时,ActivityThread 依次调用 performLaunchActivity(触发 onCreate)和 handleResumeActivity(触发 onResume)。若 onCreate 中调用了 finish() : •  performLaunchActivity 调用 onCreate 后,检查 mFinished 标志:

// ActivityThread.javaprivate Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    // ...    if (r.isPersistable()) {        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);    } else {        mInstrumentation.callActivityOnCreate(activity, r.state);    }    // 检查 mFinished 标志,若为 true,跳过后续生命周期    if (!r.activity.mFinished) {        activity.performStart(); // 触发 onStart        r.stopped = false;    }    // ...}

  由于 mFinished 被标记为 true,performStart() 不会执行,onStart 和 onResume 被跳过。 

 •  handleResumeActivity 被跳过:

ActivityThread 在 handleLaunchActivity 后,若检测到 mFinished 为 true,不再调用 handleResumeActivity。

3. 直接触发 onDestroy 系统通过 ActivityThread 调用 handleDestroyActivity,直接触发 onDestroy:

// ActivityThread.javaprivate void handleDestroyActivity(ActivityClientRecord r, boolean finishing, int configChanges) {    // ...    mInstrumentation.callActivityOnDestroy(r.activity);    // ...}

生命周期验证

 通过日志打印验证生命周期调用顺序: 

public class TestActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d("Lifecycle", "onCreate");        finish(); // 调用 finish    }
    @Override    protected void onStart() {        super.onStart();        Log.d("Lifecycle", "onStart"); // 不会执行    }
    @Override    protected void onResume() {        super.onResume();        Log.d("Lifecycle", "onResume"); // 不会执行    }
    @Override    protected void onDestroy() {        super.onDestroy();        Log.d("Lifecycle", "onDestroy"); // 执行    }}

  日志输出: 

D/Lifecycle: onCreateD/Lifecycle: onDestroy

特殊场景分析

 1. finish() 后调用 startActivity 若在 onCreate 中调用 finish() 后立即启动新 Activity: 

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    finish();    startActivity(new Intent(this, NextActivity.class));}

  • 生命周期顺序:

onCreate → onDestroy(当前 Activity)→ NextActivity 正常启动。 • 原理:

startActivity 的调用会被加入任务栈,即使当前 Activity 被销毁,系统仍会处理新 Activity 的启动。 

 2. finish() 与 onBackPressed 的区别 • finish() :直接销毁 Activity,不触发 onBackPressed。 • onBackPressed:默认调用 finish(),但可重写以添加额外逻辑(如确认对话框)。    

总结

     通过源码分析可见,onCreate 中调用 finish() 会导致系统跳过中间状态,直接销毁 Activity。这种设计避免了资源浪费,确保未完全初始化的 Activity 不会进入前台。

关注我获取更多知识或者投稿

原文链接:https://juejin.cn/post/7479350849056276532
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值