一、onCreate中finish()的生命周期流程
当 Activity 的 onCreate 方法中调用 finish() 时,其生命周期会直接跳转至 onDestroy,跳过中间的 onStart 和 onResume。这个流程由应用进程和系统服务协同完成。
onCreate():Activity在onCreate()中进行初始化。当finish()被调用时,Activity的内部标志位mFinished被设置为true。ActivityThread的拦截:ActivityThread在调用完onCreate()后,会检查Activity的isFinishing()状态。如果isFinishing()返回true,ActivityThread会拦截后续的生命周期回调,如onStart()和onResume()。onDestroy():Activity的销毁请求被发送给ActivityManagerService(AMS)。AMS在处理完请求后,会通知ActivityThread销毁Activity,从而触发onDestroy()。
二、源码解析:ActivityThread的拦截机制
ActivityThread 是应用进程中主线程的入口类,它负责接收来自 AMS 的指令,并驱动 Activity 的生命周期。
1. finish() 的调用
Activity.finish()方法会设置mFinished标志位为true,并向ActivityManagerService(AMS)发送一个销毁请求。
2. ActivityThread 的 performLaunchActivity()
ActivityThread在performLaunchActivity()方法中,会通过Instrumentation调用Activity的onCreate()方法。- 关键拦截点:在
onCreate()调用后,ActivityThread会检查Activity的mFinished标志。如果mFinished为true,它会跳过performStart()等后续的生命周期回调,从而阻止onStart和onResume的调用。
3. AMS 的销毁指令
AMS收到finish()请求后,会执行一系列任务,并最终向ActivityThread发送一个销毁Activity的指令。ActivityThread的handleDestroyActivity()方法接收到这个指令后,会调用Instrumentation的callActivityOnDestroy(),从而触发Activity的onDestroy()方法。
三、特殊场景与实践建议
1. finish() 后启动新Activity
- 在
onCreate中调用finish()后立即启动新Activity是可行的。 finish()只是一个销毁请求,而startActivity()会立即向AMS发送启动新Activity的请求。这两个请求是异步的,系统会同时处理。
2. finish() 与 onBackPressed()
onBackPressed()默认的实现是调用finish()。finish()是一个销毁Activity的命令,而onBackPressed()是一个事件回调。开发者可以重写onBackPressed()来添加自定义逻辑,如弹出确认对话框。
3. 实践建议
- 在
onCreate中调用finish()是一个罕见的场景。它通常用于当Activity的启动条件不满足时,立即退出。 - 理解这个流程,有助于开发者在
Activity的启动逻辑中,进行更精确的资源管理和状态控制。