移动开发中的生命周期:定义、阶段及工作方式

作者: IT Sectr 发布日期: 2026-03-02 阅读时间: 9 分钟

移动应用的生命周期决定了它在启动、最小化、从后台返回和关闭时的行为。本文将介绍App Lifecycle(iOS)、Activity Lifecycle(Android)、Fragment Lifecycle、ViewController Lifecycle和LifecycleOwner。理解这些过程对于防止内存泄漏、数据丢失和应用错误行为至关重要。更多详情请参阅Android Activity Lifecycle官方文档

要点

  • Activity Lifecycle(Android)包含7个方法:onCreate → onStart → onResume → onPause → onStop → onDestroy + onRestart
  • ViewController Lifecycle(iOS)按顺序调用:viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear
  • iOS App Lifecycle有5种状态:Not Running、Inactive、Active、Background、Suspended
  • Fragment Lifecycle与Activity绑定,但有自有方法:onAttach、onCreateView、onViewCreated
  • LifecycleOwner(Android)允许通过LifecycleObserver订阅生命周期事件

应用生命周期(App Lifecycle)

在分析单个屏幕的生命周期之前,理解整个应用的生命周期很重要。在iOS中,应用经历五种状态:Not Running(未运行)、Inactive(后台,不接收事件)、Active(活跃)、Background(后台,代码执行中)和Suspended(后台,代码暂停)。这些状态在AppDelegate中通过方法applicationDidFinishLaunching、applicationDidBecomeActive、applicationWillResignActive、applicationDidEnterBackground和applicationWillTerminate进行管理。

在Android中,对应的是Application Lifecycle,通过Application.ActivityLifecycleCallbacks接口进行跟踪。然而,Android更关注Activity(单个应用屏幕)的生命周期。这是因为Android应用可以由多个Activity组成,每个都有其自身的周期。

Android的现代方法是使用lifecycle-process库中的ProcessLifecycleOwner。它允许跟踪整个进程的状态而无需绑定到特定Activity。在iOS中,使用UISceneDelegate(自iOS 13起)或AppDelegate来跟踪应用状态。SceneDelegate处理iPad上的多窗口(multiwindow)。理解App Lifecycle对于IT Sectr开发具有后台同步、流媒体和VoIP通话的应用程序尤其重要。

Android中的Activity Lifecycle

Activity是Android应用的基本组件,代表一个屏幕。Activity具有明确定义的生命周期,由操作系统根据用户操作和系统事件(屏幕旋转、来电、内存不足)进行管理。

操作

方法描述
onCreate创建Activity时调用一次UI初始化、findViewById、ViewModel设置
onStartActivity变为可见启动动画、注册BroadCastReceiver
onResumeActivity获得输入焦点启动相机、传感器、动画
onPauseActivity失去焦点(部分可见)保存草稿、停止动画
onStopActivity不可见释放资源、停止更新
onDestroyActivity被销毁清理所有引用、取消订阅LiveData
onRestart在onStop之后onStart之前调用重新初始化

重要提示:onSaveInstanceState在onStop之前调用以保存临时状态。恢复在onCreate中通过Bundle savedInstanceState或ViewModel中的SavedStateHandle进行。如果没有正确处理生命周期,应用将在屏幕旋转时丢失所有未保存的数据。

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("draft", draftText)
    }
    override fun onDestroy() {
        super.onDestroy()
        // Отписка от всех подписок
    }
}

Jetpack Compose中的Activity Lifecycle

在Jetpack Compose中,Activity的生命周期保持不变,但Compose提供了额外工具:通过LifecycleOwner实现生命周期感知组合,以及LifecycleEventEffect和DisposableEffect效果以在销毁时自动清理资源。

Fragment Lifecycle详解

Android中的Fragment存在于Activity内部,具有自身的生命周期,与Activity部分重叠但添加了新方法。Fragment可以在不销毁Activity的情况下添加、替换、删除,这使其更灵活但也更复杂。

Fragment Lifecycle的主要方法:onAttach — Fragment附加到Activity(首次调用);onCreate — 数据初始化;onCreateView — 创建View;onViewCreated — View已创建,可配置UI;onStart — Fragment可见;onResume — Fragment获得焦点;onPause — Fragment失去焦点;onStop — Fragment不可见;onDestroyView — View被销毁;onDestroy — Fragment被销毁;onDetach — Fragment从Activity分离。

与Activity的主要区别:onCreateView和onDestroyView可能被多次调用(例如切换TabLayout时),而onCreate只调用一次。因此,View的初始化应在onViewCreated中进行,而非onCreateView。与View相关的资源(如RecyclerView适配器)应在onDestroyView中清理。

iOS中的ViewController Lifecycle

UIViewController是iOS中管理屏幕的基类。其生命周期由UIKit自动调用的一系列方法组成。理解这一周期对于正确的UI初始化、数据管理和内存处理至关重要。

典型用途

方法调用时机
loadView当View Controller加载其View层次结构时不使用storyboard的自定义初始化
viewDidLoadView加载到内存后(一次)UI设置、加载初始数据
viewWillAppearView在屏幕上显示之前更新数据、订阅通知
viewDidAppearView在屏幕上显示之后启动动画、启动跟踪动画
viewWillDisappearView从屏幕消失之前保存状态、取消通知订阅
viewDidDisappearView从屏幕消失之后停止动画、释放资源
deallocView Controller被销毁时释放所有资源

重要提示:viewDidLoad在View Controller的生命周期中只调用一次。要在每次出现时更新数据,请使用viewWillAppear。如果在viewWillAppear中订阅NotificationCenter,请务必在viewDidDisappear中取消订阅以避免内存泄漏。

SwiftUI生命周期

SwiftUI通过View结构管理View的生命周期。SwiftUI不使用回调方法,而是使用onAppear和onDisappear修饰符。对于全局应用状态,通过App和Scene协议使用App Lifecycle。SwiftUI根据状态自动管理View的创建和销毁,这简化了开发,但需要理解View的身份和生命周期。

swift
struct ContentView: View {
    var body: some View {
        Text("Hello")
            .onAppear {
                print("View появилась")
            }
            .onDisappear {
                print("View исчезла")
            }
    }
}

Android中的LifecycleOwner和LifecycleObserver

LifecycleOwner是Android Architecture Components中的一个接口,用于标记具有生命周期的对象(Activity、Fragment)。LifecycleObserver是一个接口,允许对象订阅LifecycleOwner的事件。它们共同构成了现代Android开发中响应式生命周期管理的基础。

与其在onStart/onStop中显式调用方法,建议使用DefaultLifecycleObserver(替代已废弃的带有@OnLifecycleEvent注解的LifecycleObserver)。这是Google为ViewModel和其他需要响应生命周期但无需直接引用Activity或Fragment的组件所推广的方法。

kotlin
class MyObserver : DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) {
        // Подписка на обновления
    }
    override fun onStop(owner: LifecycleOwner) {
        // Отписка
    }
}

在IT Sectr,我们在所有Android项目中使用LifecycleOwner。ViewModel通过viewModelScope和lifecycleScope订阅Activity的LifecycleOwner,保证在Activity销毁时自动取消协程。这防止了内存泄漏,使代码更干净、更安全。

常见问题

Android中Activity经历哪些状态?

Activity经历六种状态:Created(onCreate)、Started(onStart)、Resumed(onResume)、Paused(onPause)、Stopped(onStop)、Destroyed(onDestroy)。

iOS中ViewController Lifecycle方法按什么顺序调用?

顺序:loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear。viewDidLoad调用一次。

Android中的LifecycleOwner是什么?

LifecycleOwner是Android Architecture Components的一个组件,拥有Activity或Fragment的生命周期。允许通过LifecycleObserver订阅事件。

iOS中App Lifecycle有哪些状态?

iOS应用经历五种状态:Not Running、Inactive、Active、Background、Suspended。转换通过UIApplicationDelegate管理。

Android中的Saved State是什么?

Saved State是Android在屏幕旋转或进程重建时保留Activity/Fragment状态的机制。它使用onSaveInstanceState和SavedStateHandle。

总结

  • Android中的Activity Lifecycle(onCreate → onDestroy)——屏幕状态管理的基础
  • iOS ViewController Lifecycle(viewDidLoad → viewDidDisappear)——UIKit正确运行的关键
  • Fragment Lifecycle由于onAttach/onDetach和onCreateView/onDestroyView而比Activity更复杂
  • LifecycleOwner(Android)允许无内存泄漏地响应式订阅事件
  • App Lifecycle管理整个应用的状态(Active、Background、Suspended)
  • SwiftUI使用onAppear和onDisappear替代传统的ViewController方法
  • 正确处理生命周期可防止高达80%的典型移动应用崩溃

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目