移动应用的生命周期决定了它在启动、最小化、从后台返回和关闭时的行为。本文将介绍App Lifecycle(iOS)、Activity Lifecycle(Android)、Fragment Lifecycle、ViewController Lifecycle和LifecycleOwner。理解这些过程对于防止内存泄漏、数据丢失和应用错误行为至关重要。更多详情请参阅Android Activity 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通话的应用程序尤其重要。
Activity是Android应用的基本组件,代表一个屏幕。Activity具有明确定义的生命周期,由操作系统根据用户操作和系统事件(屏幕旋转、来电、内存不足)进行管理。
| 方法 | 描述 | |
|---|---|---|
| onCreate | 创建Activity时调用一次 | UI初始化、findViewById、ViewModel设置 |
| onStart | Activity变为可见 | 启动动画、注册BroadCastReceiver |
| onResume | Activity获得输入焦点 | 启动相机、传感器、动画 |
| onPause | Activity失去焦点(部分可见) | 保存草稿、停止动画 |
| onStop | Activity不可见 | 释放资源、停止更新 |
| onDestroy | Activity被销毁 | 清理所有引用、取消订阅LiveData |
| onRestart | 在onStop之后onStart之前调用 | 重新初始化 |
重要提示:onSaveInstanceState在onStop之前调用以保存临时状态。恢复在onCreate中通过Bundle savedInstanceState或ViewModel中的SavedStateHandle进行。如果没有正确处理生命周期,应用将在屏幕旋转时丢失所有未保存的数据。
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的生命周期保持不变,但Compose提供了额外工具:通过LifecycleOwner实现生命周期感知组合,以及LifecycleEventEffect和DisposableEffect效果以在销毁时自动清理资源。
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中清理。
UIViewController是iOS中管理屏幕的基类。其生命周期由UIKit自动调用的一系列方法组成。理解这一周期对于正确的UI初始化、数据管理和内存处理至关重要。
| 方法 | 调用时机 | |
|---|---|---|
| loadView | 当View Controller加载其View层次结构时 | 不使用storyboard的自定义初始化 |
| viewDidLoad | View加载到内存后(一次) | UI设置、加载初始数据 |
| viewWillAppear | View在屏幕上显示之前 | 更新数据、订阅通知 |
| viewDidAppear | View在屏幕上显示之后 | 启动动画、启动跟踪动画 |
| viewWillDisappear | View从屏幕消失之前 | 保存状态、取消通知订阅 |
| viewDidDisappear | View从屏幕消失之后 | 停止动画、释放资源 |
| dealloc | View Controller被销毁时 | 释放所有资源 |
重要提示:viewDidLoad在View Controller的生命周期中只调用一次。要在每次出现时更新数据,请使用viewWillAppear。如果在viewWillAppear中订阅NotificationCenter,请务必在viewDidDisappear中取消订阅以避免内存泄漏。
SwiftUI通过View结构管理View的生命周期。SwiftUI不使用回调方法,而是使用onAppear和onDisappear修饰符。对于全局应用状态,通过App和Scene协议使用App Lifecycle。SwiftUI根据状态自动管理View的创建和销毁,这简化了开发,但需要理解View的身份和生命周期。
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}LifecycleOwner是Android Architecture Components中的一个接口,用于标记具有生命周期的对象(Activity、Fragment)。LifecycleObserver是一个接口,允许对象订阅LifecycleOwner的事件。它们共同构成了现代Android开发中响应式生命周期管理的基础。
与其在onStart/onStop中显式调用方法,建议使用DefaultLifecycleObserver(替代已废弃的带有@OnLifecycleEvent注解的LifecycleObserver)。这是Google为ViewModel和其他需要响应生命周期但无需直接引用Activity或Fragment的组件所推广的方法。
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}在IT Sectr,我们在所有Android项目中使用LifecycleOwner。ViewModel通过viewModelScope和lifecycleScope订阅Activity的LifecycleOwner,保证在Activity销毁时自动取消协程。这防止了内存泄漏,使代码更干净、更安全。
常见问题
Activity经历六种状态:Created(onCreate)、Started(onStart)、Resumed(onResume)、Paused(onPause)、Stopped(onStop)、Destroyed(onDestroy)。
顺序:loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear。viewDidLoad调用一次。
LifecycleOwner是Android Architecture Components的一个组件,拥有Activity或Fragment的生命周期。允许通过LifecycleObserver订阅事件。
iOS应用经历五种状态:Not Running、Inactive、Active、Background、Suspended。转换通过UIApplicationDelegate管理。
Saved State是Android在屏幕旋转或进程重建时保留Activity/Fragment状态的机制。它使用onSaveInstanceState和SavedStateHandle。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。