Android 10.0 Activity的启动流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 10.0 Activity的启动流程相关的知识,希望对你有一定的参考价值。

参考技术A

本文主要学习记录,基于Android 10的源码,有错误欢迎指正,主要目的是梳理流程图。

以进程为单位的调用栈图如下:

1.activity中的startActivity方法最终都会通过拿到ATSM的代理IActivityTaskManager调用的startActivity;

2.之后进入system server进程中的ATMS startActivity,ATMS 经过收集Intent信息,然后使用ActivityStackSupervisor.startSpecificActivityLocked,如果进程已经存在,则直接使用realStartActivityLocked,通过App的binder客户端的代理ApplicationThread调用回到bindApplication,走入Activity的启动流程;如果进程不存在则通过socket链接Zygote,请求fork新的进程;

3.App进程创建完成后,进程启动会调用ActivityThread.main方法,初始化主线程Handler,接着走入attach方法,然后通过AMS的代理调用AMS的attachApplication方法,并将App进程的通信代理ApplicationThread传入AMS;

4.AMS获取到ATMS调用ApplicationThread的bindApplication回到App进程的ActivityThread.ApplicationThread.bindApplication方法中,然后使用Handler切换到主线程执行handleBindApplication,这里初始化了App的进程名字、时间,用户的硬件配置,包括App的文件系统,创建了App的Context实例,Instrumentation实例,调用App的onCreate回调方法,同时告诉AMS APP初始化工作完毕;

5.AMS接着会调用ATMS的attachApplication,最后调用ClientLifecycleManager的scheduleTransaction方法,通过App的Binder代理ApplicationThread回到ActivityThread;

6.进入ActivityThread.ApplicationThread.scheduleTransaction方法之后就进入了Activity的onStart、onResume回调

创建进程之前的过程主要是AMS的内部信息收集的判断的过程,下面主要看一下App进程启动的源码流程

从应用进程被创建开始,ActivityThread.main被执行

调用ActivityThread的attach方法,然后将activity和AMS通信的Binder代理IApplicationThread实例传入AMS

接着进入AMS进程,ActivityManagerService.attachApplicationLocked

1.thread.bindApplication :该方法主要讲App进程的配置信息通过IApplicationThread Binder通信回传到ActivityThread中

2.mAtmInternal.attachApplication :mAtmInternal实际就是ActivityTaskManager的实例,通过LocalServices加载

那么这里相当于走到了ActivityTaskManagerServer的attachApplication中

先看第一条:

注意:ActivityThread中存在于Binder通信的代理--》ApplicationThread extends IApplicationThread.Stub

ActivityThread--》ApplicationThread--》bindApplication

这里的bindApplication主要初始化了AppBindData,然后发送BIND_APPLICATION给APP的主线程BIND_APPLICATION,最后执行了handleBindApplication

handleBindApplication如下:

ActivityThread--》class H extends Handler

该方法主要在App进程中对App的一些硬件资源配置申请的属性、App的文件夹等完成App基本信息的初始化

接着看第二条:mAtmInternal.attachApplication

mAtmInternal.attachApplication最终会调用mRootActivityContainer.attachApplication(wpc)

RootActivityContainer.attachApplication

接着调用ActivityStackSupervisor.realStartActivityLocked开始创建Activity

ActivityStackSupervisor.realStartActivityLocked

创建ClientLifecycleManager和ClientTransactionHandler来辅助管理Activity的生命周期

注意

clientTransaction.addCallback是LaunchActivityItem

lifecycleItem是ResumeActivityItem

ClientLifecycleManager.scheduleTransaction最终会调用ClientTransaction的schedule方法

那么这个mClient是IApplicationThread的实例,那么此时也就回到了ActivityThread的ApplicationThread中

ActivityThread的ApplicationThread中

因为ActivityThread继承ClientTransactionHandler,所以到了ClientTransactionHandler中

通过Handler发送消息EXECUTE_TRANSACTION到H中

接着TransactionExecutor的execute方法

LaunchActivityItem.execute方法

client其实是在ActivityThread的实例,那么就回到了ActivityThread的handleLaunchActivity

接着调用performLaunchActivity

在performLaunchActivity中,主要是加载App的资源包,然后创建了Activity的context实例,并创建了Activity的实例,接着调用activity.attach方法,attach执行完之后调用了onCreate方法。

activity.attach

activity.attach中主要

1.创建了PhoneWindow实例

2.设置了Window接口的监听

3.初始化了成员变量,包括线程和WindowManager

到此Oncreate已经完成,那么OnStart和OnResume去哪了?

TransactionExecutor的execute方法

之前们只分析了executeCallbacks,接着executeLifecycleState方法

TransactionExecutor的executeLifecycleState方法

cycleToPath:lifecycleItem即为ResumeActivityItem

第一点:

int finish = lifecycleItem.getTargetState()

lifecycleItem对应ResumeActivityItem,如下:

ResumeActivityItem的getTargetState方法

对应ActivityLifecycleItem中的枚举类型:

第二点:ActivityClientRecord中的mLifecycleState,由于在前面已经执行了handleLaunchActivity所以mLifecycleState=1

对应ActivityLifecycleItem中的枚举类型:

PRE_ON_CREATE = 0

所以final int star = 1

接着看getLifecyclePath,此时start=1,finish=3

那么返回的IntArray就是2

接着看performLifecycleSequence

最终执行的是handleStartActivity所以最终走到了ActivityThread的handleResumeActivity

两点:

调用activity.performStart

调用Instrumetation.callActivityOnPostCreate

performStart方法:

调用了Instrumentation.callActivityOnStart方法:

最终到了activity的onStart方法

第二点:Instrumentation.callActivityOnPostCreate

上面主要走了cycleToPath,接着ResumeActivityItem.execute

调用了handleResumeActivity方法

handleResumeActivity最终调用performResumeActivity

调用了Instrumentation.callActivityOnResume,

到了activity.onResume()方法

参考文章: https://blog.csdn.net/u011386173/article/details/87802765

android Activity 四大启动模式

 

  启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;

  启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;

讲解启动模式之前,有必要先讲解一下“任务栈”的概念;

  任务栈

  每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序;比如A1-->A2-->A3,则任务栈为:

技术分享

启动模式说明

(1)standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;

技术分享

(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;

技术分享

(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;

技术分享

(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

技术分享

 

以上是关于Android 10.0 Activity的启动流程的主要内容,如果未能解决你的问题,请参考以下文章

基于android10.0源码分析Activity的启动流程

基于android10.0源码分析Activity的启动流程

Android 10.0 ActivityManagerService的启动流程

framework之Activity启动流程(基于Android11源码)

framework之Activity启动流程(基于Android11源码)

framework之Activity启动流程(基于Android11源码)