Android 架构演进:从生命周期事件到结构化任务

作者:潜龙勿用之化骨龙日期:2026/9/9

Android 生命周期,是每一个 Android 开发者都绕不开的痛。

早期我们习惯在:

1onStart()
2onStop()
3onResume()
4onPause()
5

里面处理各种业务。

后来有了 LifecycleObserver,再到 Kotlin 协程、Flow 成为现代 Android 异步编程的重要组成部分。

如果只是从 API 的变化来看,很容易得到:

1Lifecycle 回调
2        
3LifecycleObserver
4        
5Coroutine / Flow
6

但真正值得关注的,并不仅仅是 API 的变化。

而是背后的编程模型发生了变化:

Android 生命周期管理,正在从“生命周期事件驱动”,演进到“生命周期约束下的结构化任务”。


一、最初:生命周期事件驱动

最早 Android 的生命周期模型非常简单。

Activity 提供:

1onCreate()
2onStart()
3onResume()
4onPause()
5onStop()
6onDestroy()
7

开发者根据生命周期回调执行对应逻辑。

例如:

1override fun onStart() {
2    super.onStart()
3    startNetworkMonitor()
4}
5
6
7override fun onStop() {
8    stopNetworkMonitor()
9    super.onStop()
10}
11

它的关系:

1Lifecycle
2
3    
4
5生命周期事件
6
7    
8
9回调方法
10
11    
12
13开发者执行逻辑
14

生命周期本身并不知道:

  • 你启动了什么任务
  • 任务什么时候结束
  • 是否需要取消
  • 资源什么时候释放

它只是告诉你:

“我现在发生了什么。”

这就是典型的事件驱动模型。


二、LifecycleObserver:把生命周期事件独立出来

随着业务复杂,直接把大量逻辑写在 Activity 中会越来越臃肿。

于是 AndroidX 引入了 Lifecycle。

生命周期逻辑可以独立:

1class NetworkObserver : DefaultLifecycleObserver {
2    override fun onStart(owner: LifecycleOwner) {
3        startNetworkMonitor()
4    }
5
6    override fun onStop(owner: LifecycleOwner) {
7        stopNetworkMonitor()
8
9    }
10}
11

架构变成:

1LifecycleOwner
2
3      
4
5Lifecycle
6
7      
8
9LifecycleObserver
10
11      
12
13onStart / onStop
14

相比以前:

1Activity
2    |
3    |
4大量生命周期代码
5

现在:

1Activity
2
3    
4
5LifecycleObserver
6
7    
8
9业务逻辑
10

代码职责更加清晰。

但是:

LifecycleObserver 只是解决了代码组织问题,并没有改变事件驱动模型。

底层依然是:

1生命周期变化
2
3        
4
5事件通知
6
7        
8
9调用回调
10
11        
12
13执行逻辑
14

生命周期依然只是:

“告诉开发者发生了什么。”


三、传统 LifecycleObserver 模型:生命周期和数据传递是分开的

来看一个真实场景:

监听网络状态。

传统方式:

1class NetworkObserver(
2    context: Context,
3    private val onStatusChanged: (Boolean) -> Unit
4
5) : DefaultLifecycleObserver {
6
7    private val connectivityManager =
8        context.getSystemService(
9            Context.CONNECTIVITY_SERVICE
10        ) as ConnectivityManager
11
12    private val networkCallback =
13        object : ConnectivityManager.NetworkCallback() {
14
15            override fun onAvailable(network: Network) {
16                onStatusChanged(true)
17            }
18
19            override fun onLost(network: Network) {
20                onStatusChanged(false)
21            }
22        }
23}
24

Activity 使用:

1class MainActivity : AppCompatActivity() {
2
3    private val observer =
4        NetworkObserver(this) { connected ->
5
6            if (connected) {
7                showOnline()
8
9            } else {
10                showOffline()
11            }
12        }
13
14
15    override fun onCreate(
16        savedInstanceState: Bundle?
17    ) {
18        super.onCreate(savedInstanceState)
19        lifecycle.addObserver(observer)
20
21    }
22}
23

看起来很自然。

但是分析整个链路:

1LifecycleObserver
2
3        |
4
5        | 管理生命周期
6
7        
8
9ConnectivityManager.NetworkCallback
10
11        |
12
13        | 产生数据
14
15        
16
17onStatusChanged(Boolean)
18
19        |
20
21        | 回调通知
22
23        
24
25Activity 更新 UI
26

这里其实存在两个完全不同的问题:

1. 生命周期管理

负责:

1什么时候注册监听
2
3什么时候取消监听
4

例如:

1onStart()
2
3onStop()
4

2. 数据传递

负责:

1网络变化
2
3
4
5Boolean
6
7
8
9UI 更新
10

通过:

1onStatusChanged()
2

完成。


问题在于:

生命周期和数据流之间没有统一模型。

开发者需要自己维护:

1生命周期
2
3    +
4
5监听任务
6
7    +
8
9回调关系
10
11    +
12
13资源释放
14

四、传统回调模型的问题

当业务简单时:

1NetworkObserver
2        
3Activity
4

没有问题。

但是现代 App 往往存在:

1网络状态
2
3蓝牙状态
4
5GPS状态
6
7数据库变化
8
9文件上传进度
10
11WebSocket消息
12

于是代码逐渐变成:

1NetworkObserver
2
3      
4
5callback
6
7      
8
9Activity
10
11
12BluetoothObserver
13
14      
15
16callback
17
18      
19
20Activity
21
22
23LocationObserver
24
25      
26
27callback
28
29      
30
31Activity
32

最终 Activity 里面充满:

1observer.setCallback {
2
3}
4
5
6observer.setCallback {
7
8}
9
10
11observer.setCallback {
12
13}
14

开发者需要人工维护:

  • 谁注册
  • 谁取消
  • 谁还活着
  • 谁应该接收数据
  • 页面销毁后是否还有回调

生命周期只负责:

1开始
2
3结束
4

但是任务和数据:

1怎么启动
2
3怎么取消
4
5怎么传递
6
7怎么释放
8

都需要自己管理。


五、协程:异步任务开始拥有自己的生命周期

现代 Android 最大变化来自 Kotlin 协程。

例如:

1lifecycleScope.launch {
2    loadData()
3}
4

这里创建的不只是一个异步调用。

而是:

1CoroutineScope
2
3        
4
5Job
6
7        
8
9Task
10

这个 Job 拥有自己的生命周期。

例如:

1Activity
2
3   
4
5Lifecycle
6
7   
8
9CoroutineScope
10
11   
12
13Job
14
15   
16
17Network Request
18

当 Activity 销毁:

1Lifecycle Destroy
2
3        
4
5CoroutineScope cancel
6
7        
8
9Job cancel
10
11        
12
13任务结束
14

最大的变化:

异步任务第一次拥有了结构化的生命周期。


六、从事件通知,到任务边界

这是整个演进过程中最重要的变化。

传统:

1Lifecycle
2
3    
4
5START事件
6
7    
8
9onStart()
10
11    
12
13手动启动任务
14

现代:

1Lifecycle
2
3    
4
5Coroutine Scope
6
7    
8
9Job
10
11    
12
13Task
14

生命周期不再只是告诉你:

“发生了什么。”

而开始决定:

“这个任务是否应该存在。”


七、结构化并发:任务形成层级关系

协程进一步带来了结构化并发。

例如:

1lifecycleScope.launch {
2
3    launch {
4        loadUser()
5    }
6
7    launch {
8
9        loadMessage()
10
11    }
12
13    launch {
14        loadNotification()
15    }
16
17}
18

任务关系:

1             Parent Job
2
3                 |
4
5     ┌───────────┼───────────┐
6
7                           
8
9 User Job   Message Job  Notification Job
10

父任务取消:

1Parent Job
2
3      
4
5Cancel
6
7      
8
9Child Jobs
10
11      
12
13全部取消
14

这和传统生命周期代码最大的区别:

以前:

1开发者维护任务关系
2

现在:

1结构表达任务关系
2

八、Flow:持续数据也进入生命周期模型

协程解决了任务生命周期。

但是现代应用还有大量持续数据:

例如:

1网络在线
2
3    
4
5网络离线
6
7    
8
9重新在线
10

这种场景更适合:

1Flow<Boolean>
2

Flow 表达:

一个持续产生数据的数据源。

例如:

1fun observeNetwork(): Flow<Boolean> =
2
3    callbackFlow {
4        val callback =
5            object : ConnectivityManager.NetworkCallback() {
6
7                override fun onAvailable(network: Network) 
8                    trySend(true)
9                }
10
11                override fun onLost(network: Network) {
12                    trySend(false)
13                }
14            }
15
16        connectivityManager.registerNetworkCallback(
17            request,
18            callback
19        )
20
21        awaitClose {
22            connectivityManager.unregisterNetworkCallback(
23                callback
24            )
25
26        }
27
28    }
29

此时模型变化:

以前:

1NetworkCallback
2
3        
4
5callback(Boolean)
6
7        
8
9Activity
10

现在:

1NetworkCallback
2
3        
4
5Flow
6
7        
8
9Coroutine
10
11        
12
13UI
14

数据成为独立的数据流。


九、生命周期开始约束 Flow 和任务

现代 Android:

1repeatOnLifecycle(
2    Lifecycle.State.STARTED
3) {
4
5    networkFlow.collect {
6        render(it)
7    }
8
9}
10

这里生命周期的角色已经变化。

以前:

1Lifecycle
2
3告诉我:
4
5onStart
6
7onStop
8

现在:

1Lifecycle
2
3决定:
4
5任务什么时候应该存在
6

当页面不可见:

1Lifecycle
2
3        
4
5Coroutine Cancel
6
7        
8
9Flow停止收集
10
11        
12
13awaitClose释放资源
14

完整链路:

1Lifecycle
2
3      
4
5Coroutine Scope
6
7      
8
9Job
10
11      
12
13Flow
14
15      
16
17Data Source
18
19      
20
21Resource Release
22

形成闭环。


十、两种模型真正的区别

回头看:

传统模型

1Lifecycle
2
3      
4
5Event
6
7      
8
9Observer
10
11      
12
13Callback
14
15      
16
17开发者管理任务
18

关注:

发生了什么?


现代模型

1Lifecycle
2
3      
4
5State
6
7      
8
9Coroutine Scope
10
11      
12
13Structured Concurrency
14
15      
16
17Flow
18
19      
20
21Cancellation
22

关注:

当前生命周期下,哪些任务应该存在?


十一、生命周期角色的变化

因此 Android 生命周期的价值已经发生变化。

过去:

生命周期是事件通知器。

现在:

生命周期是异步任务的边界管理者。

可以简单总结:

第一阶段:事件驱动

1Lifecycle
2
3    
4
5Event
6
7    
8
9Callback
10

关注:

发生了什么。


第二阶段:生命周期观察

1Lifecycle
2
3    
4
5Observer
6
7    
8
9onStart/onStop
10

关注:

生命周期变化时我要做什么。


第三阶段:生命周期约束下的结构化任务

1Lifecycle
2
3    
4
5State
6
7    
8
9Coroutine
10
11    
12
13Job
14
15    
16
17Flow
18
19    
20
21Cancellation
22

关注:

当前状态下任务应该存在多久。


十二、总结

Android 生命周期的演进,表面看是 API 的变化。

但本质是异步编程模型的变化。

过去:

1Lifecycle
2
3    
4
5事件
6
7    
8
9Callback
10
11    
12
13手动管理任务
14

现在:

1Lifecycle
2
3    
4
5状态约束
6
7    
8
9Coroutine Scope
10
11    
12
13Structured Concurrency
14
15    
16
17Flow
18
19    
20
21Cancellation
22

所以可以概括:

以前,生命周期告诉你“发生了什么”;现在,生命周期开始决定“任务能存在多久”。

最终:

1Lifecycle        管边界
2
3Coroutine        管任务
4
5Flow             管数据
6
7Cancellation     管结束
8

真正的变化,不是少写了几个:

1onStart()
2onStop()
3

而是:

Android 从“开发者监听生命周期事件并手动拼装异步逻辑”,演进到“利用生命周期约束结构化管理任务、数据和资源”。

LifeCycleSample


Android 架构演进:从生命周期事件到结构化任务》 是转载文章,点击查看原文


相关推荐


举手之劳 -- 肘子的 Swift 周报 #151
东坡肘子2026/9/1

举手之劳 上个周末,我在北京参加了由苹果举办的 App 孵化器活动,本次的主题主要围绕 AI 时代的应用开发、运营和商业模式展开。与会者大多是 IT 公司的管理者和应用开发者,整个活动期间,大家对 AI 的热情都很高,也纷纷讨论各自对于 AI 的理解和应用技巧,我从中收获不少。 会议结束后,我和一位从事传统行业的朋友吃饭。他对 AI 基本一窍不通。作为一个新兴概念,他也想了解,但一直没有切实感受到 AI 究竟能给他的企业带来什么。就餐过程中,他接到一个电话,一个客户要求立刻调整方案。当时正值周末


NativePHP v4 让 Blade 构建原生 iOS 与 Android 界面
BingoGo2026/8/24

NativePHP v4 让 Blade 构建原生 iOS 与 Android 界面 NativePHP 现在可以将 Blade 组件渲染为 iOS 上真正的 SwiftUI 视图和 Android 上的 Jetpack Compose 视图,整个过程无需 WebView 或 HTML。NativePHP 将这项技术称为 SuperNative。Simon Hamp 与 Shane Rosenthal 于 7 月 30 日在二人于波士顿主办的 The Vibes 活动上发布了 SuperNati


Apple Intelligence 已通过审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148
东坡肘子2026/8/11

Apple Intelligence 已通过审核,即将在中国提供服务 在 WWDC 26 上,苹果公布了新的 Apple Intelligence 架构,不仅在云端引入 Gemini,第三代 Apple Foundation Models 也确认由苹果与 Google 合作构建。这一度让我以为,Apple Intelligence 进入中国市场的难度反而进一步增加了。 但事情的发展比预想中更快。7 月,Apple Intelligence 已经出现在中国国家互联网信息办公室(CAC)公布的最新一


最小二乘法计算触摸事件速度
别怪我很水2026/8/1

最小二乘法计算触摸事件速度 引言:为什么需要计算触摸速度?在触控设备(如手机、平板、触摸屏)上,我们经常需要根据用户的触摸滑动速度来调整交互行为。例如,在滚动列表时,快速滑动应该让列表继续惯性滚动一段距离,而慢速滑动则应该立即停止。这些功能的核心在于准确计算触摸事件的速度。然而,由于触摸采样率的限制和手指抖动的噪声干扰,直接使用相邻两点的位移除以时间间隔会得到不稳定的速度值。最小二乘法通过拟合多个采样点的数据,能够有效平滑噪声,估算出更准确的速度。## 基础概念:最小二乘法的数学原理最小二乘法是


QML 文字波动与视觉干扰:波浪、倒影、故障
Quz2026/7/24

目录 Demo 1 波浪跳动 演示代码 关键逻辑解析 Demo 2 倒影镜像 演示代码 关键逻辑解析 Demo 3 故障风效果 演示代码 关键逻辑解析 运行验证 扩展复用方向 工程下载


Android window属性全解析
solo_992026/7/16

Android Theme XML 属性如何影响 PhoneWindow:从 TypedArray 到 LayoutParams 的完整链路 每天写布局、配主题,但你有没有想过——android:windowIsTranslucent="true" 这行 XML 到底是怎么一路传递,最终影响了 Window 的像素格式?为什么 statusBarColor 有时候怎么设都不生效?FLAG_LAYOUT_IN_SCREEN 到底是干什么的?本文将带你深入 Android Framework 源码


GitHub 热榜项目 - 周榜(2026-07-04)
CoderJia_2026/7/8

GitHub 热榜项目 - 周榜(2026-07-04) 生成于:2026-07-04 共发现热门项目: 21 个 Token赞助:siliconflow 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 本期热点趋势总结 本期 GitHub 热榜明显聚焦 AI Agent 工程化:多智能体协作、MCP / 知识图谱记忆、代码库索引与任务编排成为核心热点,代码生成、网页克隆、视频编辑、招聘评估等场景快速落地;


【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(一学就会的深度学习基础算法详解)
承渊政道2026/6/30

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 ✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介: 神经网络看起来由大量矩阵、激活函数和参数组成,但训练过程可以浓缩成四句话:先用当前参数完成一次预测;再用损失函数衡量预测有多差;接着通过链式法则把误差逐层传回;最后沿着能让损


栈和队列的实现
纪念 2292026/6/21

༺ 个人主页 · 纪念229 ༻ 🏠我的博客主页🏠 ༒专栏目录:《数据结构》༒ ༒其它有趣的计算机知识༒ ༺世上本没有路,走的人多了自然就有了༻ 这篇文章讲述的是用顺序表实现栈、用单链表实现队列,本文主要讲述栈和队列的定义,希望对大家有所帮助! 文章目录 1.Stack.h2.Stack.c2.1 STackDesTroy(ST* ps)2.2STackPush(ST* ps, STDataType x)2.3 STackEmpty(ST* ps)2.4 S


【云计算】华为公有云构建高可用Redis集群
Harvy_没救了2026/6/13

华为公有云构建高可用Redis集群(3主3从 + AS弹性扩容)详细方案 一、方案概述 本方案基于华为云服务(ECS、VPC、AS、IMS、ELB),手动搭建一个 Redis Cluster(3主3从),并通过 弹性伸缩AS 实现自动扩容(增加节点),但不配置自动缩容。扩容时新节点自动加入集群,并通过脚本完成集群拓扑更新。整体架构满足 高可用、负载均衡、水平扩展 的需求。 核心技术栈 服务作用VPC + 安全组隔离网络,保证内网互通ECS运行Redis服务的云服务器(6台基础节点)IMS

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读