全面解析activity:activity的工作过程

author author     2023-04-18     687

关键词:

参考技术A 本文将对Activity的工作过程进行分析。

主要学习以下内容:

(1)系统内部是如何启动一个Activity的?

(2)新Activity的对象是何时创建的?

(3)Activity的各个生命周日是被系统何时回调的?

Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。

Activity的启动流程整体如下:

一.Activity启动阶段

(一)涉及到的概念

进程:Android系统为每个APP分配至少一个进程

IPC:跨进程通信,Android中采用Binder机制。

(二)涉及到的类

ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。

ActivitySupervisor:管理 activity 任务栈

ActivityThread:ActivityThread 运行在UI线程(主线程),App的真正入口。

ApplicationThread:用来实现AMS和ActivityThread之间的交互。

ApplicationThreadProxy:ApplicationThread 在服务端的代理。AMS就是通过该代理与ActivityThread进行通信的。

IActivityManager:继承与IInterface接口,抽象出跨进程通信需要实现的功能

AMN:运行在server端(SystemServer进程)。实现了Binder类,具体功能由子类AMS实现。

AMS:AMN的子类,负责管理四大组件和进程,包括生命周期和状态切换。AMS因为要和ui交互,所以极其复杂,涉及window。

AMP:AMS的client端代理(app进程)。了解Binder知识可以比较容易理解server端的stub和client端的proxy。AMP和AMS通过Binder通信。

Instrumentation:仪表盘,负责调用Activity和Application生命周期。测试用到这个类比较多。

(三)涉及到的进程

(1)Launcher所在的进程

(2)AMS所在的SystemServer进程

(3)要启动的Activity所在的app进程

如果是启动根Activity,就涉及上述三个进程。

如果是启动子Activity,那么就只涉及AMS进程和app所在进程。

(四)具体流程

Launcher:Launcher通知AMS要启动activity。

startActivitySafely->startActivity->Instrumentation.execStartActivity()(AMP.startActivity)->AMS.startActivity

AMS:PMS的resoveIntent验证要启动activity是否匹配。如果匹配,通过ApplicationThread发消息给Launcher所在的主线程,暂停当前Activity(即Launcher)。

暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?

存在:发送消息LAUNCH_ACTIVITY给需要启动的Activity主线程,执行handleLaunchActivity

不存在:通过socket向zygote请求创建进程。进程启动后,ActivityThread.attach

判断Application是否存在,若不存在,通过LoadApk.makeApplication创建一个。在主线程中通过thread.attach方法来关联ApplicationThread。

在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。

继续通过ApplicationThread来发送消息给主线程的Handler来启动Activity (handleLaunchActivity)。

handleLauchActivity:调用了performLauchActivity,里边Instrumentation生成了新的activity对象,继续调用activity生命周期。

IPC过程:

双方都是通过对方的代理对象来进行通信。

1.app和AMS通信:app通过本进程的AMP和AMS进行Binder通信

2.AMS和新app通信:通过ApplicationThreadProxy来通信,并不直接和ActivityThread通信

(五)参考函数流程

Activity启动流程(从Launcher开始):

第一阶段: Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)

第二阶段:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity(在AMS所在进程执行)

第三阶段:pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)

第四阶段:检查activity所在进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Process.start创建一个新进程(执行在AMS进程)

第五阶段: 创建ActivityThread实例,执行一些初始化操作,并绑定Application。如果Application不存在,会调用LoadedApk.makeApplication创建一个新的Application对象。之后进入Loop循环。(执行在新创建的app进程)

第六阶段:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)

第七阶段: 加载MainActivity类,调用onCreate声明周期方法(执行在新启动的app进程)

从另一个角度下图来概括:

下面简要介绍一下启动的过程:

        Step 1. 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口; 

        Step 2. ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;

        Step 3. ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;

        Step 4. ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;

        Step 5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;

        Step 6. ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;

        Step 7. ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。

深入activity,activity启动模式launchmode完全解析

...【DylanAndroid的博客】在平时的开发中,我们可能会了解到Activity的任务栈还有Activity的启动模式。那么Activity的启动模式都分别是怎么样的呢?如果设置了这些启动模式对任务栈有事么影响 ,还有就是这么启动模式 查看详情

activity生命周期浅析

正常情况下,Activity会经历如下生命周期。如图所示:(1)onCreate()  一般用于一些初始化工作,比如加载界面布局资源,初始化所需要的数据。(2)onRestart()  重新启动Activity,Activity由不可见变为可见时调用。(3)onStart()... 查看详情

android四大组件之activity(下)

(一)概述(二)Activity1.Activity,Window与View的关系下面是自己查阅资料,看了下一点源码的归纳所得,如果哪写错了欢迎指出!下面贴下小结图:流程解析:Activity调用startActivity后最后会调用attach方法,然后在PolicyManager实现一... 查看详情

探究activity--activity的基本用法

一、Activity是什么Activity(活动)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中应该包括零个或多个Activity。二、Activity的基本用法1、手动创建活动(1)、重新创建一个项... 查看详情

activity初窥门径

本节引言:上一节中我们对Activity一些基本的概念进行了了解,什么是Activity,Activity的生命周期,如何去启动一个Activity等,本节我们继续来学习Activity,前面也讲了一个App一般都是又多个Activity构成的,这就涉及到了多个Activity... 查看详情

activity的生命周期

介绍Activity的生命周期,我们得先了解什么是Activity。Activity是一个负责与用户交互的组件,用户可以用来交互为了完成某项任务,而且Activity提供一个屏幕,它上面能显示些控件并且监听用户的事件做出反应。 发一张Activity... 查看详情

eventbus3.0:入门使用及其使用完全解析(代码片段)

...是观察者模式的一个最佳实践。我们平常开发中,当遇到Activity与Activity、Activity 查看详情

android新建项目时各个activity的区别

Android新建项目时系统会有几个Activity模板,像BlankActivity、BlankActivitywithFragment、EmptyActivity、FullscreenActivity、Master/DetailFlow、NavigationDrawerActivity、TabbedActivity,有哪位Android大神能说说它们的区别吗?Android新建项目默认只有一个MainAc... 查看详情

一起学android之activity(代码片段)

概述本文以一个简单的小例子,简述Android开发中Activity的相关知识,仅供学习分享使用。什么是Activity?Activity是一个应用程序组件,通常显示为一个页面,用户可以通过Activity进行交互,Activity窗口通常是满屏的,但有时也会比屏... 查看详情

如何在view中取得activity对象

参考技术A今天想实现在view中返回上一个activity的功能,想了半天。因为在虽然view是包含于一个activity的,但是直接在view中用this取得的对象不是activity而是这个view,直接写activity的名字也不行。于是找到了这个方法并附上!首先... 查看详情

menuItemclick上从Activity(Activity->Fragment->Fragment)向Fragment的Fragment发送数据

】menuItemclick上从Activity(Activity->Fragment->Fragment)向Fragment的Fragment发送数据【英文标题】:SendingdatatoFragmentofFragmentfromActivity(Activity->Fragment->Fragment)onmenuItemclick【发布时间】:2018-04-1417:38:22【问题描述】:我正在尝试 查看详情

android第一行代码-activity(代码片段)

文章目录Android第一行代码Activity1、Activity基本用法2、创建和加载布局加载布局(在Activity中加载布局)在AndroidManifest文件中注册(所有的activity都要在AndroidManifest.xml中进行注册)配置主Activity(activity标签内部添加标签)在Activi... 查看详情

Intent.FLAG_ACTIVITY_CLEAR_TASK 和 Intent.FLAG_ACTIVITY_TASK_ON_HOME 的区别

】Intent.FLAG_ACTIVITY_CLEAR_TASK和Intent.FLAG_ACTIVITY_TASK_ON_HOME的区别【英文标题】:DifferencebetweenIntent.FLAG_ACTIVITY_CLEAR_TASKandIntent.FLAG_ACTIVITY_TASK_ON_HOME【发布时间】:2014-03-1700:05:58【问题描述】:来自Android文档:FLAG_ACTIVITY_CL 查看详情

activity切换动画---点击哪里从哪放大

emmmm,这次来梳理一下Activity切换动画的研究。首先,老规矩,看一下效果图:效果图这次要实现的动画效果就是类似于上图那样,点击某个view,就从那个view展开下个Activity,Activity退出时原路返回,即缩放到点击的那个view。实... 查看详情

如何在 Android 上的活动之间传递值?

...2011-08-1616:44:21【问题描述】:这是我的应用程序的导航:Activity1调用Activity2→Activity2.finish(),调用Activity3→Activity3.finish()当Activity3完成时,它会调用Activity1的onResu 查看详情

android的oncreate里边savedinstancestate啥时候不为空

你的Activity不在前台,也就是不可见的时候,可能会被系统杀掉(android内存机制),系统会在杀掉Activity之前给它一个机会来保存当前的状态,如View的值,这个回调是Activity的publicvoidonSaveInstanceState(BundlesavedInstanceState)super.onSaveInstanc... 查看详情

全面解析文件文件系统

前言:文件系统作为linux总最基础的但愿。理解并深入了解文件系统对linux的学习有重要意义。我们从文件系统创建,构成以及工作流程几个方面全方位的介绍文件系统的相关概念。简述:一块完整的磁盘经过分区后我们就可以... 查看详情

ovs总体架构源码结构及数据流程全面解析

在前文「从Bridge到OVS」中,我们已经对OVS进行了一番探索。本文决定从OVS的整体架构到各个组件都进行一个详细的介绍。OVS架构OVS是产品级的虚拟交换机,大量应用在生产环境中,支撑整个数据中心虚拟网络的运转。OVS基于SDN的... 查看详情