我的编程空间,编程开发者的网络收藏夹
学习永远不晚

[图解]Android源码分析——Activity的启动过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

[图解]Android源码分析——Activity的启动过程

Activity的启动过程一.Launcher进程请求AMSLauncher.java的startActivitySafely方法的执行过程:Activity.java中startActivity方法的执行过程:startActivityForResult方法的执行过程:Instrumentation.java中execStartActivity方法的执行过程:二.AMS调用ApplicationThreadActivityManagerService.java中startActivity的执行过程:startActivityAsUser方法的执行过程:ActivityStarter.java中startActivityMayWait方法的执行过程:ActivityStarter.java中startActivityLocked方法的执行过程:ActivityStarter.java中startActivity方法(23个参数)的执行过程:ActivityStarter.java中startActivity方法(9个参数)的执行过程:startActivityUnchecked方法的执行过程:ActivityStackSupervisor.java中resumeFocusedStackTopActivityLocked方法的执行过程:ActivityStack.java中resumeTopActivityUncheckedLocked方法的执行过程:resumeTopActivityInnerLocked方法的执行过程:ActivityStackSupervisor.java中startSpecificActivityLocked方法的执行过程:realStartActivityLocked方法的执行过程:三.ActivityThread启动ActivityActivityThread.java中scheduleLaunchActivity方法的执行过程:ActivityThread.java中handleMessage方法的执行过程:ActivityThread.java中handleLaunchActivity方法的执行过程:performLaunchActivity方法的执行过程:Instrumentation.java中callActivityOnCreate方法的启动过程:Activity.java中performCreate方法的执行过程:
在这里插入图片描述 一.Launcher进程请求AMS

      当我们点击桌面的应用图标,会调用Launcher.java的startActivitySafely方法。

Launcher.java的startActivitySafely方法的执行过程:

      1.调用Intent对象的addFlags方法,添加Intent.FLAG_ACTIVITY_NEW_TASK标志
使根Activity在新的任务栈中启动。
      2.调用startActivity方法。

Activity.java中startActivity方法的执行过程:

      调用startActivityForResult方法。

startActivityForResult方法的执行过程:

      调用Instrumentation对象的execStartActivity方法。
      Instrumentation用来监控应用程序和系统的交互。

Instrumentation.java中execStartActivity方法的执行过程:

      1.调用ActivityManager的getService方法获取AMS的代理对象。
      采用AIDL的形式,通过IActivityManager和AMS进行通信。
      Android8.0之前调用ActivityManagerNative的getDefault方法获取AMS的代理对象。采用类似AIDL的形式,由ActivityManagerNative的内部类ActivityManagerProxy和AMS进行通信。
      2.调用AMS代理对象的startActivity方法。

二.AMS调用ApplicationThread ActivityManagerService.java中startActivity的执行过程:

      调用startActivityAsUser方法,该方法比上一个方法增加了一个int类型的userId参数,AMS会根据此参数确定调用者的权限。

startActivityAsUser方法的执行过程:

      1.调用enforceNotIsolatedCaller方法,判断调用者进程是否被隔离。
      若进程被隔离,则抛出SecurityException异常。
      2.调用UserController对象的handleIncomingUser方法检查调用者权限。
      若没有权限,则抛出SecurityException异常。
      3.调用ActivityStarter对象的startActivityMayWait方法。
      该方法比上一个方法中增加了两个参数:一个为TaskRecord类型的inTask,代表要启动的Activity所在的栈。另一个为String类型的reason,代表启动Activity的理由,此时的reason=”startActivityAsUser”。

ActivityStarter.java中startActivityMayWait方法的执行过程:

      调用startActivityLocked方法。
      ActivityStarter是Android7.0加入的类,它是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转化为Activity,并将Activity和Task以及Stack相关联。

ActivityStarter.java中startActivityLocked方法的执行过程:

      1.判断启动理由不为空,若为空,则抛出IllegalArgumentException异常。
      2.调用startActivity方法(23个参数)。

ActivityStarter.java中startActivity方法(23个参数)的执行过程:

      1.调用AMS对象的getRecordForAppLocked方法,传入Launcher进程的ApplicationThread对象作为参数,获取ProcessRecord对象。
      ProcessRecord用于描述一个应用程序进程。
      2.传入参数(ProcessRecord对象、AMS对象…),创建ActivityRecord对象。
      ActivityRecord用来描述一个Activity,记录一个Activity的所有信息。
      3.将创建的ActivityRecord对象保存在ActivityRecord数组中。
      4.将ActivityRecord数组作为参数,调用startActivity方法(9个参数)。

ActivityStarter.java中startActivity方法(9个参数)的执行过程:

      调用startActivityUnchecked方法,该方法主要处理与栈管理相关的逻辑。

startActivityUnchecked方法的执行过程:

      1.判断Intent的Flag是否设置了FLAG_ACTIVITY_NEW_TASK标记。
      2.若设置了,调用setTaskFromReuseOrCreateNewTask方法,创建TaskRecord对象。
      TaskRecord用来描述一个Activity任务栈。
      3.调用ActivityStackSupervisor对象的resumeFocusedStackTopActivityLocked方法。

ActivityStackSupervisor.java中resumeFocusedStackTopActivityLocked方法的执行过程:

      1.调用ActivityStack对象的topRunningActivityLocked方法,获取要启动的Activity所在栈的栈顶且不处于停止状态的ActivityRecord对象。
      2.若ActivityRecord对象不为null,且要启动的Activity的状态不是RESUMED状态,则调用ActivityStack对象的resumeTopActivityUncheckedLocked方法。

ActivityStack.java中resumeTopActivityUncheckedLocked方法的执行过程:

      调用resumeTopActivityInnerLocked方法。

resumeTopActivityInnerLocked方法的执行过程:

      调用ActivityStackSupervisor对象的startSpecificActivityLocked方法。

ActivityStackSupervisor.java中startSpecificActivityLocked方法的执行过程:

      1.调用AMS对象的getProcessRecordLocked方法,返回ProcessRecord对象。
      获取即将启动的Activity所在的应用程序进程。
      2.若要启动的Activity的应用程序进程已经运行,则调用realStartActivityLocked方法。

realStartActivityLocked方法的执行过程:

      1.通过调用代表要启动Activity进程的Process对象的成员变量thread获取ApplicationThread对象。
      2.调用ApplicationThread对象的scheduleLaunchActivity方法。

三.ActivityThread启动Activity ActivityThread.java中scheduleLaunchActivity方法的执行过程:

      1.将启动Activity的参数封装成ActivityClientRecord对象。
      2.调用sendMessage方法向H类发送类型为LAUNCH_ACTIVITY的消息,并将ActivityClientRecord对象传递过去。

      sendMessage方法最终调用H对象的sendMessage方法,最终在ActivityThread.java的handleMessage方法得到处理。ApplicationThread是一个Binder,运行在Binder线程池,通过H实现将代码逻辑切换到主线程。

ActivityThread.java中handleMessage方法的执行过程:

      1.通过调用Message对象的成员变量obj获取ActivityClientRecord对象。
      2.调用getPackageInfoNoCheck方法获取LoadedApk对象,并将其赋值给ActivityClientRecord对象的成员变量packageInfo。
      LoadedApk用来描述已经加载的Apk文件,应用程序进程要启动Activity需要Activity所属的Apk加载进来。
      3.调用handleLaunchActivity方法,传入ActivityClientRecord对象作为参数。

ActivityThread.java中handleLaunchActivity方法的执行过程:

      1.调用performLaunchActivity方法,传入ActivityClientRecord对象作为参数,获取启动的Activity对象。
      2.若该Activity对象不为null,则调用handleResumeActivity方法,将Activity的状态置为Resume。
      3.若该Activity对象为null,则调用AMS的finishActivity方法停止启动Activity。

performLaunchActivity方法的执行过程:

      1.通过调用ActivityClientRecord对象的成员变量activityInfo获取ActivityInfo对象。
      ActivityInfo用来存储代码以及AndroidManifest设置的Activity和Receiver信息节点。
      2.若ActivityClientRecord对象的成员变量packageInfo为null,则调用getPackageInfoNoCheck方法获取LoadedApk对象,并为其赋值。
      3.调用ActivityClientRecord对象的成员变量intent的getComponent方法,获取ComponentName对象
      ComponentName中保存了Activity的包名和类名。
      4.调用createBaseContextForActivity方法创建要启动的Activity的上下文环境,返回ContextImpl对象。
      5.调用ContextImpl对象的getClassLoader方法获取ClassLoader对象。
      6.调用Instrumentation对象的newActivity方法,根据ComponentName对象中存储的Activity类名,用类加载器创建Activity实例,返回Activity对象。
      7.调用ActivityClientRecord对象的成员变量packageInfo的makeApplication方法创建Application对象。
      8.若Activity对象不为null,调用Activity对象的attach方法,初始化Activity对象。
      9.调用Instrumentation对象的callActivityOnCreate方法启动Activity。

Instrumentation.java中callActivityOnCreate方法的启动过程:

      调用Activity对象的performCreate方法。

Activity.java中performCreate方法的执行过程:

      调用onCreate方法。


作者:LeeDuo.


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

[图解]Android源码分析——Activity的启动过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

[图解]Android源码分析——Activity的启动过程

Activity的启动过程一.Launcher进程请求AMSLauncher.java的startActivitySafely方法的执行过程:Activity.java中startActivity方法的执行过程:startActivityF
2022-06-06

Android组件Activity的启动过程深入分析

这篇文章主要介绍了Android组件Activity的启动过程,Activity作为Android四大组件之一,他的启动没有那么简单。这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程。activity的启动流程随着版本的更替,代码细节一直在进行更改,每次都会有很大的修改
2023-05-15

Tomcat源码分析 | 启动过程深度解析

在启动过程中,LifecycleBase 首先发出 STARTING_PREP 事件,StandardServer 额外还会发出 CONFIGURE_START_EVENT 和 STARTING 事件,通知 LifecycleListene

Android Service的启动过程分析

Android Service的启动过程分析 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会阻塞主线程的。长时间就直接ANR了。 我们知道Servic
2022-06-06

Android中 Activity的启动过程有哪些

Android中 Activity的启动过程有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。分析Android Activity的启动过程
2023-05-30

Android组件Activity的启动过程是什么

这篇文章主要介绍了Android组件Activity的启动过程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android组件Activity的启动过程是什么文章都会有所收获,下面我们一起来看看吧。在分析
2023-07-06

ContentProvider启动流程源码分析

本文小编为大家详细介绍“ContentProvider启动流程源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“ContentProvider启动流程源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C
2023-07-05

如何用Play源代码分析Server启动过程

这期内容当中小编将会给大家带来有关如何用Play源代码分析Server启动过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Play是个Rails风格的Java Web框架。如何调试请看此处。以下进入正题
2023-06-17

Android启动过程深入解析

当按下Android设备电源键时究竟发生了什么?Android的启动过程是怎么样的?什么是Linux内核?桌面系统linux内核与Android系统linux内核有什么区别?什么是引导装载程序?什么是Zygote?什么是X86以及ARM l
2022-06-06

Android Service启动过程完整分析

刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会阻塞主线程的。长时间就直接ANR了。 我们知道Service可以执行一些后台任务,是后台任务不是耗时的任
2022-06-06

【SpringBoot3.0源码】启动流程源码解析 • 上

文章目录 初始化 SpringBoot启动类: @SpringBootApplicationpublic class AppRun { public static void main(String[] args
2023-08-23

SpringBoot启动流程SpringApplication源码分析

这篇“SpringBoot启动流程SpringApplication源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“S
2023-07-05

Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

在前面一篇文章Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机制中的Server角色是如何
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录