【笔记】ActivityManagerService 流程

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】
                              
                              
                              
                              
                              
                              

猜你喜欢

转载自blog.csdn.net/pirionFordring/article/details/83417267