Framework - AMS

Activity的启动流程(基于Android 10.0源码) 应用的启动流程大致分为如下四个阶段: 一.应用进程(Launcher)调用ATMS系统进程的过程 二.ActivityTaskManagerService到ApplicationThread的调用过程 三.AMS向Zygote发送启动应用进程的过程 四.ActivityThread启动Activity的过程 阅读详情

参考文章

一、概念

Android10(API29)开始,ActivityTaskManagerService 接管 ActivityManagerService。

二、启动ATMS过程

三、启动APP & 跳转Activity过程

  1. 调用 Activity 的 startActivity 方法来启动目标 Activity
  2. 接着就会调用到 Instrunmentation 的 execStartActivity 方法,通过获取 ATMS 的 binder 代理对象,然后调用到 ATMS 的 startActivity 中去
  3. 调用到 ATMS 中后,会执行到ActivityStarter 的 execute 方法,内部最终执行到了 executeRequest ,接着就会进行一些校验和判断权限,包括进程检查,intent检查,权限检查等,后面就会创建 ActivityRecord ,用来保存 Activity 的相关信息,
  4. 然后就会根据启动模式计算 flag ,设置启动 Activity 的 Task 栈。
  5. 在 ActivityTaskSupervisor 中检查要启动的 Activity 进程是否存在,存在则向客户端进程 ApplicationThread 回调启动 Activity,否则就创建进程。
  6. 会调到 ActivityThread 后在 TransactionExecute 中开始执行system_server回调回来的事务,处理各种回调,切换到对应的生命周期
  7. 最后又回调到 ActivityThread 的 handleLaunchActivity 来启动 Activity。在其中调用了 performLaunchActivity 方法。
  8. 在 performLaunchActivity 中通过反射创建 Activity 实例,如果没有 Application 则先进行创建,然后再调用Activity 的 attach 方法进行初始化,最后回调 activity 的 onCreate 方法。

3.1 Activity → ATMS

启动一个 APP 或跳转一个 Activity 都是调用的 startActivity(),进而调用 startActivityForResult()。

3.1.1 Activity 

Activity{
    public void startActivity(Intent intent, @Nullable Bundle options) {
        startActivityForResult(intent, -1, options);
    }
    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
        //委托给Instrumentation来启动
        Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
        mMainThread.sendActivityResult(mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());
    }
}

3.1.2 Instrumentation

Instrumentation{
    //形参who:用来启动Activity的对象
    //形参contextThread:Binder对象,具有跨进程通信的能力,传入的是mMainThread.getApplicationThread()
    //形参token:Binder对象,指向了服务端一个 ActivityRecord 对象
    //形参target:当前Activity
    public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, String target, Intent intent, int requestCode, Bundle options) {
        //获取一个Binder对象,转为AIDL所属类型(ATMS的proxy),然后调用ATMS的startActivity()进行跨进程通信
        int result = ActivityTaskManager.getService().startActivity(whoThread,
            who.getOpPackageName(), who.getAttributionTag(), intent,
            intent.resolveTypeIfNeeded(who.getContentResolver()), token, target,
            requestCode, 0, null, options);
        //判断能否启动Activity,不能启动就会抛出异常,例如activity未在manifest中声明等。
        checkStartActivityResult(result, intent);
    }
}
ActivityTaskManager{
    public static IActivityTaskManager getService() {
        return IActivityTaskManagerSingleton.get();
    }
    //一种单例模式
    private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton = new Singleton<IActivityTaskManager>() {
        @Override
        protected IActivityTaskManager create() {
            //获取ATMS的代理对象Binder
            final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
            return IActivityTaskManager.Stub.asInterface(b);
        }
    };
}

3.2 ATMS → PMS

ActivityTaskManagerService{
    public final int startActivity(IApplicationThread caller, String callingPackage, String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, UserHandle.getCallingUserId());
    }
    private int startActivityAsUser(IApplicationThread caller, String callingPackage, @Nullable String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
        //获取ActivityStarter实例,去执行execute方法
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
            .setCaller(caller)
            ...
            .execute();
    }
}
ActivityStarter{
    int execute() {
        if (mRequest.activityInfo == null) {
            mRequest.resolveActivity(mSupervisor);
        }
    }
    static class Request {
        void resolveActivity(ActivityTaskSupervisor supervisor) {
            //AndroidManifest中intent标签
            resolveInfo = supervisor.resolveIntent(intent, resolvedType, userId, 0, computeResolveFilterUid(callingUid, realCallingUid, filterCallingUid));
            //转为Activity标签
            activityInfo = supervisor.resolveActivity(intent, resolveInfo, startFlags, profilerInfo);
        }
    }
}
ActivityTaskSupervisor{
    ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags, int filterCallingUid) {
        //通过ATMS获取抽象类PackageManagerInternal
        //PMS内部类PackageManagerInternalImpl实现了它(内部类持有外部类,就可以调用PMS的方法了)
        //resolveIntent()会将从PMS的mPackages中查询到的ActivityInfo赋值给ResultInfo
        mService.getPackageManagerInternalLocked().resolveIntent(intent, resolvedType, modifiedFlags, privateResolveFlags, userId, true, filterCallingUid);
    }
    //将获取的ResultInfo转为ActivityInfo
    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, ProfilerInfo profilerInfo, int userId, int filterCallingUid) {
        final ResolveInfo rInfo = resolveIntent(intent, resolvedType, userId, 0, filterCallingUid);
        return resolveActivity(intent, rInfo, startFlags, profilerInfo);
    }
}

3.3 AMS → ApplicationThread

android源码宇宙-activity启动源码 Activity栈中的一个节点,用于展示一个Activity它集成了WindowToken实现了WindowManagerService中的一个接口既然如此顺便看看WindowToken吧用来替代ActivityStackSupervisor这东西是ActivityThread中的一个变量它可以作为一个测试框架的根基,因为它是先于我们的Application和Activity启动的,所以它可以监听到我们创建Activity和Application操作。android是支持自定义Instrumentation 阅读详情

相关推荐

Activity启动流程分析(android-29)

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

2401_84149724的博客 994

android Hook IActivityManager和IActivityTaskManager

public class HookManager { private static final String TAG = "HookManager"; public static void hookActivityManager(){ if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P){ hookIActivityTaskManager(); }else{ .

xiaobaaidaba123的专栏 1962

ActivityManagerService第一讲之Activity启动流程

一.Activity启动简述 我们从Launcher启动某个应用,本质上就是Activity的启动。我们下面简单的讲述一下整个流程。此处流程是基于Android-10源码。 二.Activity启动流程 该流程是基于根Activity启动的,也就是我从桌面中点击应用图标开始的。 1.Activity#startActivity ​ 传入参数为intent和Bundle。最终都是调用startAct...

zplxl99的专栏 2218

ActivityManagerService和ActivityTaskManagerService启动详解—Android 12(一)

ActivityManagerService太负责了,尤其是Android12的AMS没有相关文章,那我们就从它的启动开始分析源码,梳理ActivityManagerService、ActivityTaskManager、WindowManagerService等相关类的关系。

lvyaer_1122的博客 4614

Android Activity——启动过程探索(三)

在《Android Activity——启动过程探索(一) 和 《Android Activity——启动过程探索(二) 中我们知道了Activity启动的生命周期回调,并且分析了其中当前Activity的 onPause() 和新打开的Activity的 onCreate() 、 onStart()和onResume()回调执行过程,也就是新的Activity已经完成了 “创建->用户可见->用户可操作” 的过程。那么当前的Activity就变为不可见了,需要执行 onstop() 回调,如

ITRenj的博客 1151

Android:ActivityTaskManagerService接管ActivityManagerService

ActivityManagerService这个服务,对于玩Android的开发人员,应该再熟悉不过了,它是掌管Activity的核心。 不过从Android 10.0(API 29)开始,再看ActivityManagerService的代码,会发现,ActivityManagerService的工作已经被ActivityTaskManagerService这个服务接管了。具体我们就看看这里的变化。 虽然说ActivityTaskManagerService接管了ActivityManagerServ

bdmh的专栏 4320

Android Framework AMS(16)进程管理

说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。我们先来了解下Linux的进程管理,基于此,我们再谈Android的进程管理体系。最后了解AMS中2个关键的进程管理API:updateLruProcessLocked 和 updateOomAdjLocked。

wangdsh的博客 2377

基于强化学习框架的交易策略学习过程

每个状态s∈S 是一个由六个微观结构特征构成的向量,这些特征反映了当前市场的订单簿状态和近期交易行为。

xu624735206的博客 1111

Android framework调试和AMS等服务调试

产物services.jar和framework.jar一样,在/system/framework/目录下,所以调试AMS的时候,make framework是不行的。其中的services.core就包含了/frameworks/base/services/core目录下的内容,例如ActivityManagerService。编译/frameworks/base/services目录下的代码,详见/frameworks/base/services/Android.bp中的定义。

叶辞树的博客 330

群晖Hyper Backup还原实战:加密与非加密备份的完整操作指南

本文详细介绍了群晖Hyper Backup在加密与非加密备份场景下的完整还原操作指南。通过实战案例和高级技巧,帮助用户应对硬盘故障或系统崩溃时的数据恢复挑战,特别是加密备份恢复中的关键节点和常见陷阱。

weixin_29323365的博客 441

【实战指南】Green Hills MULTI-IDE 从零安装到工程创建全流程

本文详细介绍了Green Hills MULTI-IDE从零安装到工程创建的全流程,包括系统要求检查、安装步骤、工程配置及调试技巧。特别适合嵌入式开发新手快速上手这款专业IDE工具,提升开发效率。

weixin_28740299的博客 477

【framework】AMS启动流程

1 前言 AMS 即 ActivityManagerService,负责 Activy、Service、Broadcast、ContentProvider 四大组件的生命周期管理。本文主要介绍 AMS 的启动流程和初始化过程。AMS 在初始化的过程中,也伴随着了ATMS(ActivityTaskManagerService)的初始化。 AMS 创建流程简述: SystemServer:依次调用 main()、run()、startBootstrapServices(),再调用 Lifecyle 的

little_fat_sheep 1261

上位机介绍:C# 开发者的必知基础

上位机是指在工业控制系统中,位于上层、负责人机交互和数据管理的计算机/软件,与“下位机”(PLC、传感器、变频器、单片机等硬件设备)相对应,核心是“向下通信控制设备,向上展示交互数据”。下位机:一线干活的“工人”(执行采集、控制指令);上位机:指挥管理的“办公室人员”(发指令、看数据、做报表)。C#开发者掌握上位机开发的核心是“通信+UI+稳定性基础层:搞懂WinForms/WPF基础、串口/Modbus通信,能实现核心功能;进阶层:掌握分层设计、异步编程、工业级容错(断线重连、数据校验);

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1559

Android Framework AMS(03)AMS关键类解读

说明:本章节主要涉AMS的关键类及其设计理念的解读,主要关注图中下方AMS关键类解读部分即可。这么做的目的是为了后面章节分析AMS时更容易理解其相关概念和相关流程。毕竟AMS涉及的关键类较多,直接看流程会导致很多地方不容易理解。在Android系统中,AMS(ActivityManagerService)是Android系统中非常核心的服务,主要负责应用程序的管理和调度。: 这是Android系统中负责管理应用程序生命周期和进程调度的核心服务。

wangdsh的博客 1654

基于STM32+华为云设计的智能鱼缸

本项目基于STM32单片机设计一款基于物联网的智能鱼缸系统,并通过应用侧接口开发上位机APP实现远程对鱼缸参数的检测和控制。该系统包括水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能,可以帮助用户更好地管理鱼缸,提高鱼儿的生存率,同时增强用户对家庭装饰品的掌控感和科技感。

1万+

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程​ ,人工智能,计算机视觉,大模型,AI,本文围绕计算机视觉论文复现展开,介绍从理论到可运行代码的全流程。先强调复现的重要性,再讲解复现前的准备,包括明确目标、构建工具链;接着说明代码获取分析、环境配置调优、调试运行技巧及结果验证优化方法,还推荐了高效工具,提及复现中的伦理规范。旨在助读者掌握复现方法论,实现从经典模型到前沿论文的复现,推动学术成果落地。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

Android Framework 之AMS详解

Android 10将原先AMS中对activity的管理和调度移到了ActivityTaskManagerService中,位置放到了wm下(见上面完整路径),因此AMS负责四大组件中另外3个(service, broadcast, contentprovider)的管理和调度。源码位置/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java。ProcessRecord.java:记录每个进程的信息。

门徒07的博客 770

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析

通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。

2201_76125261的博客 723

activity启动流程(andriod10.0源码分析)

一.重点角色 要将启动流程,首先介绍一下activity启动流程中几个重要的角色 Activity //activity本身的类对象 Instrumentation //代理操作activity所有流程的代理类 ActivityThread //app生命周期管理的实现类,一个app的启动,这个类里面的main函数就是入口 IApplicationThread //app进程中的ApplicationThread在系统进程中的bindler接口类 ActivityThread.

分享+记录 557

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 342

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Activity启动源码分析-基于Android10(二)

文章目录Activity的IPC通信 总流程图 Instrumentation 负责调用Activity和Application生命周期。 ActivityTaskManagerService 负责Activity管理和调度等工作。android10中新增的 ActivityManagerService 负责管理四大组件和进程,包括生命周期和状态切换。 ActivityTaskManagerI...

RQ997832的专栏 3583

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android ActivityManagerService

ActivityManager是一个系统级别的管理者,主要负责管理和监控所有正在运行的组件(包括Activity、Service、BroadcastReceiver等),并为应用程序提供一些基本的系统服务。它负责调度资源、管理进程、监控应用程序的状态等工作,被视为Android系统中最重要的服务之一。

liuning1985622的博客 2364

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Activity Deeplink启动来源获取源码分析

mReferrer很容易通过重写context的getBasePackageName()被伪造,在使用时一定要小心。通过ActivityManageService获取的Uid是无法被伪造的,可以考虑使用Uid来转换PackageName。作者:vivo互联网技术链接:https://juejin.cn/post/7030977861691375629来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

chuyouyinghe的专栏 390

Activity(一)—— Activity的启动流程

Activity的启动流程 1.1 根Activity的启动流程 点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的AMS(ActivityManagerService)发起startActivity的请求。 system_server进程接收到请求后,采用Socket IPC向Zygote进程发出创建APP进程的请求; Zygote进程fork出新的进程,即APP进程; APP进程通过Binder IPC向system_server进程发起attac

xingyu19911016的博客 8820

Activity启动过程——10.0源码分析

安卓10 activity启动流程分析

backer 2241

把Activity从taskManager中删除

android:excludeFromRecents = "true"   http://schemas.android.com/apk/res/android"       package="com.example.test"       android:versi

jackie_gnu的专栏 746
上一篇: Android 架构 - MVI
下一篇: Jetpack - ViewModel
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值