Android进阶——Android四大组件启动机制之Activity启动过程

前言

Activity启动过程涉及到的比较多的知识点有Binder的跨进程通讯,建议先看完Binder的跨进程通讯再来阅读本篇文章,在文章阅读开始,我们先要理解Activity启动模型,再者去理解有关Activity启动的基本概念,梳理Activity启动流程,这样在看源码的时候可以根据这条流程往下走。文章的主要目的是弄清楚基本概念,对启动流程有个大概的认识即可。

启动模型

借用Gityuan博客的一张图,很形象的概括启动过程的整个过程,具体如图所示

这里写图片描述

基本概念

一、从大体角度

  • Instrumentation:负责监控系统与应用之间的交互
  • ActivityThread:描述应用程序进程

二、从细节角度

  • ActivityStackSupervisor(ASS):负责管理多个ActivityStack
  • ActivityStack(AS):栈式管理结构,负责管理栈内的TaskRecord,栈顶的TaskRecord表示当前可见的任务
  • TaskRecord(TR):栈式管理结构,负责管理栈内的ActivityRecord,栈顶的ActivityRecord表示当前可见的界面
  • ActivityRecord(AR):负责维护对应的Activity组件的运行状态以及信息
  • ProcessRecord(PR):记录着属于一个进程的所有ActivityRecord,ActivityRecord可能跟运行在TaskRecord中的ActivityRecord属于同一个

这里会用一张比较直观的图来解释它们的关系

这里写图片描述

三、从跨进程角度

启动过程中会涉及到Binder通讯,需要理解这几个基本概念

  • ActivityManagerService(AMS):负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作
  • ActivityManagerNative(AMN):AMS的Binder本地对象
  • ActivityManagerProxy(AMP):AMS的Binder代理对象
  • ApplicationThread(AT):接收AMS的指令并与ActivityThread通讯,是ActivityThread与AMS连接的桥梁
  • ApplicationThreadNative(ATN):AT的Binder本地对象
  • ApplicationThreadProxy(ATP):AT的Binder代理对象

概念详解

一、ProcessRecord

属性描述
BatteryStats电量统计的接口
ApplicationInfo系统进程的ApplicationInfo是从android包中解析出来的数据,应用程序的ApplicationInfo是从AndroidManifest.xml中解析出来的数据
Process Name进程名称
UID进程的UID。系统进程的UID是1000(Process.SYSTEM_UID),应用进程的UID是从10000(Process.FIRST_APPLICATION_UID)开始分配的
maxAdj, curAdj, setAdj各种不同的OOM Adjustment值
lastPss, lastPssTime物理内存(PSS)相关,进程中有对象创建或销毁时,PSS相关的属性会被更新
activities, services, receivers进程中的Android组件,随着进程的运行,这些信息都可能需要更新
pkgList进程中运行的包
thread该属性是IApplicationThread类型的对象,当ProcessRecord绑定到一个实际进程的时候,thread会被赋值

二、ActivityRecord

属性描述
ActivityInfo从标签中解析出来的信息,包含launchMode,permission,taskAffinity等
mActivityTypeActivity的类型有三种:APPLICATION_ACTIVITY_TYPE(应用)、HOME_ACTIVITY_TYPE(桌面)、RECENTS_ACTIVITY_TYPE(最近使用)
appToken当前ActivityRecord的标识
packageName当前所属的包名,这是由静态定义的
processName当前所属的进程名,大部分情况都是由静态定义的,但也有例外
taskAffinity相同taskAffinity的Activity会被分配到同一个任务栈中
intent启动当前Activity的Intent
launchedFromUid启动当前Activity的UID,即发起者的UID
launchedFromPackage启动当前Activity的包名,即发起者的包名
resultToresultTo表示上一个启动它的ActivityRecord,当需要启动另一个ActivityRecord,会把自己作为resultTo,传递给下一个ActivityRecord
stateActivityRecord所处的状态,初始值是ActivityState.INITIALIZING
appActivityRecord的宿主进程
taskActivityRecord的宿主任务
inHistory标识当前的ActivityRecord是否已经置入任务栈中
frontOfTask标识当前的ActivityRecord是否处于TaskRecord的栈顶
newIntentsIntent数组,用于暂存还没有调度到应用进程Activity的Intent

三、TaskRecord

属性描述
taskidTaskRecord的唯一标识
taskType任务栈的类型,等同于ActivityRecord的类型,是由任务栈的第一个ActivityRecord决定的
intent在当前任务栈中启动的第一个Activity的Intent将会被记录下来,后续如果有相同的Intent时,会与已有任务栈的Intent进行匹配,如果匹配上了,就不需要再新建一个TaskRecord了
realActivity, origActivity启动任务栈的Activity,这两个属性是用包名(CompentName)表示的,real和orig是为了区分Activity有无别名的情况,如果AndroidManifest.xml中定义的Activity是一个alias,则此处real表示Activity的别名,orig表示真实的Activity
affinityTaskRecord把Activity的affinity记录下来,后续启动Activity时,会从已有的任务栈中匹配affinity,如果匹配上了,则不需要新建TaskRecord
rootAffinity记录任务栈中最底部Activity的affinity,一经设定后就不再改变
mActivitiesTaskRecord是一个栈结构,栈的元素是ActivityRecord,其内部实现是一个数组mActivities
stack当前TaskRecord所在的ActivityStack

四、ActivityStack

属性描述
stackId每一个ActivityStack都有一个编号,从0开始递增。编号为0,表示桌面所在的ActivityStack(HomeStack)
mTaskHistoryTaskRecord数组,ActivityStack栈就是通过这个数组实现的
mPausingActivity当前处于Pausing状态的Activity
mResumedActivity当前处于Resumed状态的Activity
mStacks当ActivityStack执行一次设备绑定操作时,就会将mStacks这个属性赋值成ActivityDisplay.mStacks

五、ActivityStackSupervisor

属性描述
mHomeStack主屏(桌面)所在ActivityStack
mFocusedStack表示焦点ActivityStack,它能够获取用户输入
mLastFocusedStack上一个焦点ActivityStack
mActivityDisplays表示当前的显示设备,ActivityDisplay中绑定了若干ActivityStack

启动流程

这里使用一张图来介绍启动流程最适合不过了

这里写图片描述

简单的总结整个流程

  1. 构建启动的ActivityRecord
  2. 寻找当前宿主的TaskRecord
  3. 将TaskRecord挪到ActivityStack的栈顶位置
  4. 将ActivityRecord插入到TaskRecord栈顶位置
  5. 进行常规检查,权限检查,启动参数修正
  6. 将当前正在显示的Activity迁移到Pausing状态
  7. 尝试将栈顶的ActivityRecord迁移到Resumed状态
  8. 真正启动Activity,走生命周期

源码分析

由于前面的知识点已经讲得非常多了,在看源码的过程中对基本概念不会有太多解释,各位可以时不时的翻回去对照下各个类的作用

1、Activity.startActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

startActivityForResult参数-1表示不关心启动后结果的返回

2、Activity.startActivityForResult

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

mMainThread.getApplicationThread():数据类型为ApplicationThread的Binder本地对象 
mToken: 数据类型为IBinder,为Binder代理对象,但它指向AMS的AR的Binder本地对象

3、Instrumentation.execStartActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

ActivityManagerNative.getDefault():获取AMS的代理对象AMP,从而来通知启动Activity组件

4、AMP.startActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

由Binder中AIDL知识可知,mRemote.transact()会在服务端执行onTransact()回调,onTransact()回调则会去调用AMS.startActivity()

5、AMS.startActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

mStackSupervisor的数据类型为ActivityStackSupervisor

6、ASS.startActivityMayWait

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

7、ASS.startActivityLocked

主要流程:参数设置、常规检查、权限检查、AppSwitch

startActivityLocked()如此多的函数入参,意味着该函数的执行场景非常多

函数入参描述
callerBinder本地对象mToken
intent启动Activity的Intent
revolvedTypeIntent的解析类型
aInfoActivity的静态信息类
voiceSession,voiceInteractor语音相关的接口
resultTo调用者Activity
resultWho调用者Activity的字符串
requestCode请求码
callingPid,callingUid调用者的进程号和用户号
callingPackage调用者包名
realCallingPid,realCallingUid 
startFlags启动Activity的Flag
options 
ignoreTargetSecurity 
componentSpecified 
outActivity记录启动的ActivityRecord
container 
inTask待启动Activity所在的任务
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106

startActivityLocked()的返回值会int类型,我们来列举其返回值的结果 

返回值描述
START_SUCCESS(0)启动成功
START_INTENT_NOT_RESOLVED(-1)无法解析Intent所请求的Activity
START_CLASS_NOT_FOUND(-2)无法找到目标Activity的类
START_FORWARD_AND_REQUEST_CONFLICT(-3)带RequestCode启动Activity时,存在的一种与resultTo冲突的场景
START_PERMISSION_DENIED(-4)调用者没有获取启动Activity的授权
START_NOT_VOICE_COMPATIBLE(-7)当前并不支持语音
START_NOT_CURRENT_USER_ACTIVITY(-8)目标Activity并非对当前用户可见
START_SWITCHES_CANCELED(4)App Switch功能关闭时,需要将待启动的Activity推入Pending状态

8、ASS.startActivityUncheckedLocked

主要流程:

  1. Activity各种启动参数(Launcher Mode和Launcher Flag)的组合修正
  2. 处理目标Activity已经启动过的场景,只需要把其找出来,重新挪到前台显示即可
  3. 处理目标Activity不存在的场景,即该Activity没有被启动过,或者启动过后已经销毁的场景

startActivityUncheckedLocked()参数也比较多,大部分是前面已经介绍过,这里不重复出现

函数入参描述
r待启动的Activity记录信息,startActivityLocked()新建的ActivityRecord对象
sourceRecord调用者的Activity记录信息,即当前还处于显示状态的ActivityRecord
doResume表示是否要将Activity推入Resume状态,从startActivityLocked()传入进来的参数值为true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421

startActivityUncheckedLocked()的返回值会int类型,我们来列举其返回值的结果

返回值描述
START_CLASS_NOT_FOUND(-2)无法找到目标Activity的类
START_SUCCESS(0)启动成功
START_RETURN_INTENT_TO_CALLER(1)当启动参数中带有START_FLAG_ONLY_IF_NEEDED标志时,如果目标Activity就是当前的调用者,则返回该值,启动结束
START_TASK_TO_FRONT(2)在已有任务中找到了目标Activity,则只需要把目标Activity挪到前台即可,启动结束
START_DELIVERED_TO_TOP(3)目标Activity位于任务栈顶,则只需要将Intent派送到栈顶的Activity即可,启动结束
START_RETURN_LOCK_TASK_MODE_VIOLATION(5)目标Activity的宿主任务处于LockTaskMode模式,且目标Activity的启动方式违背了LockTaskMode的规则,则不能启动目标Activity

9、AS.startActivityLocked

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119

10、ASS.resumeTopActivitiesLocked

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

11、AS.resumeTopActivityLocked

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

12、AS.resumeTopActivityInnerLocked

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276

13、ASS.startSpecificActivityLocked

主要作用:如果宿主进程不存在,则创建新的进程

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

14、ASS.realStartActivityLocked

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

15、ATP.scheduleLaunchActivity

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

由Binder中AIDL知识可知,mRemote.transact()会在服务端执行onTransact()回调,onTransact()回调则会去调用AT.scheduleLaunchActivity()

16、AT.scheduleLaunchActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

17、H.handleMessage

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

18、ActivityThread.handleLaunchActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

19、ActivityThread.performLaunchActivity

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

结语

Activity的启动流程很复杂,文章主要是抓住了主干来进行分析。文章多处借鉴别人的分析结果,综合有关信息完成的代码解释。其实Activity的启动的分支判断特别复杂,还有很多分支是没有进行分析的,建议想去了解某个分支的朋友可以用调试模式去代码中跑着看。

转载于:https://my.oschina.net/JiangTun/blog/1794333

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值