【笔记】ActivityManagerService 流程

本文深入探讨了Android系统中Activity的启动过程,包括从Launcher到AMS的调用链路,Binder机制下的Client-Server交互,以及ActivityStarter和ActivityStackSupervisor在启动流程中的角色。分析了AMSsystemReady()的触发时机,以及Launcher如何通过Intent启动应用。同时,介绍了ActivityRecord和ProcessRecord的作用,以及Qualcomm在startProcessLocked中的拦截机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.AMSsystemReady() 都是SystemServer 启动此service后,完成启动,SystemServer主动调用的。

2.  1.HOME 点击icon
    2.application 中调用startActivity
    3.Back 键
    4.长按HOme 键显示最近运行Task
    5.adb shell 启动
    以上都是通过Binder 机制的Client端最终调用Server 端的AMS 的startActivityXXX
    
    
3.Launcher启动
  1. PKMS 获取APP 的AndroidManifest 中的MAIN activity 的Intent,Launcher2.apk 通过这个Intent 启动 对应APK。 直接调用AMS.startActivity-->AMS.startActivityForResult
  
  ****.mActivityStarter 在AMS的结构函数中创建,AMS的唯一的mStackSupervisor(ActivityStackSupervisor.java) 创建唯一的一个mActivityStarter(ActivityStarter.java) ,mActivityStarter 中的mSupervisor 就是AMS 中传下的 mStackSupervisor。
  
  ****. qualcomm  在 startProcessLocked 函数中添加的拦截,startProcessLocked 函数返回一个ProcessRecord 单位,此单位不为null 时,就会新建一个ActivityThread; 为null 时就不创建ActivityThread,启动Activity fail。
  
  ****. ActivityStarter 和 ActivityStackSupervisor 是AMS 的2个成员变量,ActivityStackSupervisor传入ActivityStarter 的构造函数中的mSupervisor,作为ActivityStarter的一个成员变量。
  
  ****. ActivityRecord 是在ActivityStarter.startActivity() 中创建,为Activity 状态的记录对象  , ProcessRecord  是ActivityRecorder 的一个成员变量。
  
  ****.ActivityStarter.startActivity() 中,初始化一个ProcessRecord,代表新启动activity 的进程的状态对象,初始化pid 和uid。【一个Activity 对应一个ProcessRecord,保存在AMS中】
  
  ****. ActivityStarter.startActivityUnchecked --- > ActivityStarter.setTargetStackAndMoveToFrontIfNeeded() 是最终的移动task 到堆栈,影响AMS 启动Activity 的顺序。
  
  
  2. application 中启动Activity: AMS.startActivity-->AMS.startActivityMayWait
  
  3. Launcher3   
     中启动Activity:Launcher.startActivitySafely()
                     --->Activity.startActivity()
                     -->Activity.startActivityForResult()
                     -->AMS.startActivity()
                     -->ActivityManagerService.startActivityAsUser()【原生在这里有对调用者权限进行检测: 仅仅检测userid 是否有权限限制】
                     -->ActivityStarter.startActivityMayWait()
                     -->ActivityStarter.startActivityLocked()
                     -->ActivityStarter.startActivity()【JLQ 监听!!!!!!】
                     -->ActivityStarter.startActivityUncheck()【处理Activity的启动模式,进而处理task 和 stack 的问题   !!!】【四种模式,会对task 有操作,避免这种操作,在这之前进行监听】
                     --- ... ... 
                     --->AMS.startProcessLocked()【Qualcomm 监听拦截: 如果不符合自启动条件,创建ProcessRecord 失败,返回null, 不会继续创建ActivityRecoder 对象 ,不会再AMS 的堆栈里放入ActivityRecoder】
                              
                              
                              
                              
                              
                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值