• Android Framework基础知识:AMS职责


    一、前言

            关于AMS如何创建启动的可以看这一篇

            关于PMS相关知识的可以看这一篇

            为了更加了解AMS的源码,我们从我们如何跳转一个Activity开始走进源码。

            源码:Android 6.0

            例如:启动一个Actiivty代码

    1. val intent = Intent(this, SecondActivity::class.java)
    2. startActivity(intent)

             启动流程大概分为三步:

    1. Activity 把启动任务交给 AMS        
    2. AMS 去找 PMS 获取Activtity相关信息
    3. AMS 把相关信息发送给 ActivityThread,由ActivityThread来创建启动的Activity

    接下来,我们先看第一步。如何从

    二、从Activity到AMS

            首先,我们从startActivity方法入手,会来到InstrumentationexecStartActivity方法,执行如下代码:

    也可以注意到,execStartActivity方法返回的是一个null,通过这可以知道Activity把任务交给AMS去处理,自己返回了一个null回去。

     至此,从Activity到AMS的流程就结束,接下来是AMS如何从PMS获取到Activity的相关信息。

    三、从AMS到PMS

    先看下ActivityTaskManager.getService()获取的值,获取到的是一个Binder Proxy对象,用来给Activity与AMS作进程通信。

    此时就会来到ActivityManagerServicestartActivity方法。(注意:此时是system_server进程)

    会一路来到com.android.server.wm.ActivityTaskManagerService#startActivityAsUser方法里,执行execute方法

    来到 com.android.server.wm.ActivityStarter#execute方法

     在这里方法里,很明显我们的Activity不需要等待返回,直接走下面的startActivity方法。

    执行mSupervisor.resolveIntent 方法,解析传入的intent。

    (注意,等下获取完Activity信息后还会回来这里。)

    来到resolveIntent方法,获取PMS去解析我们的intent信息等。此时就会返回ResolveInfo,而ResolveInfo里就会有ActivityInfo(包括其他四大组件)。

    getPackageManagerInternalLocked方法返回的是一个PackageManagerInternal对象,而这个对象其实就是PackageManagerInternalImpl

    PackageManagerService 2581行有如下代码:

    所以说,我们的getPackageManagerInternalLocked方法获取的是PackageManagerInternalImpl对象

    此时的 resolveIntent 方法调用就会来到PackageManagerInternalImplresolveIntent 方法

    resolveIntentInternal调用又会来到PackageManagerService内部调用,查询到我们的Activity信息返回(这里就不过多描述了)。有了Activity信息后,我们回到ActivityStarterexcute方法。

    会执行到如下代码:

    在这个方法的里,最终会执行startActivityUnchecked

    最后发消息给ActivityThread的mH,处理Activity事件,反射创建Activity,然后一步步的走它的生命周期。

    四、从AMS到ActivityThread

    到ActivityThread就没什么说的了,无非是Activity的创建和一系列生命周期的回调。

     而这个ClientTransaction的实例就有如下

    举一个例子,LaunchActivityItem(Activity的创建相关任务),如下:

     可以看到,又执行了handleLaunchActivity,而这个方法其实就是ActivityThreadhandleLaunchActivity方法

    最后,再来提问个问题,AMS能直接访问PMS嘛?

    当然可以,他们都是system_server进程创建出来的

  • 相关阅读:
    ubuntu安装Anaconda
    斐波那契数-动规
    动态列的excel导出
    jvm 一之 类加载器
    基于快速行进平方法的水面无人船路径规划
    《嵌入式 - 深入剖析STM32》STM32 启动流程详解(GCC)
    【送书福利-第二十七期】《边缘计算系统设计与实践》
    esp32开发板学习
    JavaScript大作业 基于HTML+CSS+JavaScript站酷静态页面官网7页
    自然语言处理(NLP)—— 信息提取与文档分类
  • 原文地址:https://blog.csdn.net/wumeixinjiazu/article/details/126020082