为了更加了解AMS的源码,我们从我们如何跳转一个Activity开始走进源码。
源码:Android 6.0
例如:启动一个Actiivty代码
- val intent = Intent(this, SecondActivity::class.java)
- startActivity(intent)
启动流程大概分为三步:
接下来,我们先看第一步。如何从
首先,我们从startActivity方法入手,会来到Instrumentation的execStartActivity方法,执行如下代码:
也可以注意到,execStartActivity方法返回的是一个null,通过这可以知道Activity把任务交给AMS去处理,自己返回了一个null回去。
至此,从Activity到AMS的流程就结束,接下来是AMS如何从PMS获取到Activity的相关信息。
先看下ActivityTaskManager.getService()获取的值,获取到的是一个Binder Proxy对象,用来给Activity与AMS作进程通信。
此时就会来到ActivityManagerService的startActivity方法。(注意:此时是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 方法调用就会来到PackageManagerInternalImpl的resolveIntent 方法
而resolveIntentInternal调用又会来到PackageManagerService内部调用,查询到我们的Activity信息返回(这里就不过多描述了)。有了Activity信息后,我们回到ActivityStarter的excute方法。
会执行到如下代码:
在这个方法的里,最终会执行startActivityUnchecked
最后发消息给ActivityThread的mH,处理Activity事件,反射创建Activity,然后一步步的走它的生命周期。
到ActivityThread就没什么说的了,无非是Activity的创建和一系列生命周期的回调。
而这个ClientTransaction的实例就有如下
举一个例子,LaunchActivityItem(Activity的创建相关任务),如下:
可以看到,又执行了handleLaunchActivity,而这个方法其实就是ActivityThread的handleLaunchActivity方法
最后,再来提问个问题,AMS能直接访问PMS嘛?
当然可以,他们都是system_server进程创建出来的