Android Activity生命周期:onCreate中finish()的特殊流程

613 阅读2分钟

一、onCreatefinish()的生命周期流程

ActivityonCreate 方法中调用 finish() 时,其生命周期会直接跳转至 onDestroy,跳过中间的 onStartonResume。这个流程由应用进程系统服务协同完成。

  1. onCreate()ActivityonCreate() 中进行初始化。当 finish() 被调用时,Activity 的内部标志位 mFinished 被设置为 true
  2. ActivityThread的拦截ActivityThread 在调用完 onCreate() 后,会检查 ActivityisFinishing() 状态。如果 isFinishing() 返回 trueActivityThread拦截后续的生命周期回调,如 onStart()onResume()
  3. onDestroy()Activity 的销毁请求被发送给 ActivityManagerService(AMS)。AMS 在处理完请求后,会通知 ActivityThread 销毁 Activity,从而触发 onDestroy()

二、源码解析:ActivityThread的拦截机制

ActivityThread 是应用进程中主线程的入口类,它负责接收来自 AMS 的指令,并驱动 Activity 的生命周期。

1. finish() 的调用

  • Activity.finish() 方法会设置 mFinished 标志位为 true,并向 ActivityManagerService(AMS)发送一个销毁请求。

2. ActivityThreadperformLaunchActivity()

  • ActivityThreadperformLaunchActivity() 方法中,会通过 Instrumentation 调用 ActivityonCreate() 方法。
  • 关键拦截点:在 onCreate() 调用后,ActivityThread 会检查 ActivitymFinished 标志。如果 mFinishedtrue,它会跳过 performStart() 等后续的生命周期回调,从而阻止 onStartonResume 的调用。

3. AMS 的销毁指令

  • AMS 收到 finish() 请求后,会执行一系列任务,并最终向 ActivityThread 发送一个销毁 Activity 的指令。
  • ActivityThreadhandleDestroyActivity() 方法接收到这个指令后,会调用 InstrumentationcallActivityOnDestroy(),从而触发 ActivityonDestroy() 方法。

三、特殊场景与实践建议

1. finish() 后启动新Activity

  • onCreate 中调用 finish() 后立即启动新 Activity 是可行的。
  • finish() 只是一个销毁请求,而 startActivity() 会立即向 AMS 发送启动新 Activity 的请求。这两个请求是异步的,系统会同时处理。

2. finish()onBackPressed()

  • onBackPressed() 默认的实现是调用 finish()
  • finish() 是一个销毁 Activity命令,而 onBackPressed() 是一个事件回调。开发者可以重写 onBackPressed() 来添加自定义逻辑,如弹出确认对话框。

3. 实践建议

  • onCreate 中调用 finish() 是一个罕见的场景。它通常用于当 Activity 的启动条件不满足时,立即退出。
  • 理解这个流程,有助于开发者在 Activity 的启动逻辑中,进行更精确的资源管理和状态控制。